Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views : Ad Clicks : Ad Views :

RxSwift

/
/
/
344 Views

Reactive Programming

ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety, concurrent data structures, and non-blocking I/O.
http://reactivex.io/

ReactiveX는 정의된 내용중 중요한 단어를 나열해 리엑티브 프로그래밍에 대해서 간단히 정의해 보자.

  • Observable
  • Observer pattern
  • Asynchronous
  • Operators

이벤트를 발생하는 Observable과 이것을 관찰하는 Observer를 통해 비동기 이벤트 처리하며, Operators를 통한 변화를 바로 반영하는 비동기 프로그래밍 페러다임이라고 할 수 있다. 결국 비동기 프로그래밍을 좀더 원활하게 할 수 있게 도와주는 라이브러입니다. 위의 용어들에 대해서 하나씩 살펴 보면서 좀더 자세히 리엑티브 프로그래밍(RxSwift)에 대해서 알아보자.

Imperative vs Reactive

Reactive 는 반응하다라는 뜻입니다. 명령형과 비교해서 어떠한 차이가 있는지 확인해 보자.

명령형은 x, y 값이 한번 정해져서 r값이 정해지면 x, y 값을 바꾼다고 해도 r의 값은 처음 정해진 그 값 그대로입니다.

그에반해 반응형은 x, y 값이 변하면  r 값도 그에 따라 변한다. 즉 x, y 을 관찰하고 있는 r값은 x, y의 변화에 따라 즉각 반응을 하는걸 알 수 있다.

차이점이 보이시나요? 반응형 프로그래밍은 구독하고 관찰하고 있는 대상의 변화를 기다리다, 변화를 감지하고 바로 반응하고 표현해 주는 것입니다. Notification 과 비슷합니다. Observer pattern 이지만 Operators를 사용하여 그 사용성을 더욱 확장했다.

Asynchronous And Event Stream

RxSwift의 장점 중 하나인 비동기 작업과 이벤트 스트림의 흐름을 그대로 표현이 아닐까 싶다. 그럼 실제 예를 보면서 장점을 보도록 살펴보도록 하죠.

요구사항:
로그인 버튼을 클릭하면 로그인 API를 호출한 후 내정보, 친구목록, 결재이력을 화면에 표시해 준다.
단, 토큰이 유효하다는 전제하에 진행한다.
1. Login 버튼을 클릭한다.
2. 토큰 유효성 검사를 한다.
3. MyInfo API를 호출한다.
4. Friends API를 호출한다.
5. PurchasedList API를 호출한다.
6. 화면에 표시한다.

위의 요구사항을 구현하기 위해서는 델리게이트 또는 클로저를 이용해서 구현이 가능하다. 다만 좀 복잡해지고 코드를 리뷰하는 것도 결코 쉽지는 않을 거라 생각한다.

요구사항을 간단히 RxSwift로 구현해 보았다. 처음 이 코드를 보는 사람도 로그인 버튼을 클릭하면 어떤한 작업을 해야하는지 이벤트 스트림을 보면 쉽게 파악이 가능하다. 또한 위의 요구사항이 변경이 되더라도 이벤트의 추가 삭제만으로 쉬운 요구 사항은 개선이 가능하다.

이 코드에서 사용한 flatMap, zip 과 같은 많은 Operators 를 이용하면 더 많은 작업을 할수 있다. 자세한 Operators에 대한 설명은 아래에서 더 자세히 다루도록 한다.

Observable

RxSwift를 하면서 가장 기본이 되고 많이 접한 단어가 Observable일 것이다. Observable은 Sequence라고도 하며 하나의 흐름 즉 Stream이라고 할 수 있다. Observable이 하나 또는 연속하는 스트림을 방출하여 옵저버가 반응한다. 즉 옵저버는 Observable을 구독한다고 표현을 한다.

onNext, onCompleted, and onError

Observable이 새로운 스트림을 방출하게 되면 onNext 메서드를 호출한다. Error가 발생하지 않았다면 Observable은 onCompleted 메서드를 호출한다. onCompleted 이벤트가 발생하면 더이상 이벤트는 방출되지 않으며 시퀀스는 종료된다.

시퀀스에서 정상적인 동작이 이루어지지 않을때, 즉 에러가 발생할때에 Observable은 onError 메서드를 호출한다. onCompleted와 마찬가지로 onError 이벤트가 방출되고 나면 이 시퀀스는 종료된다.

RxSwift의 Event.swift에 정의 되어 있는 Event을 보면 이해가 더 편하실 것이다.

  • next(Element) // next 이벤트가 방출될때 Element에 해당하는 데이터가 함께 방출된다.
  • error(Swift.Error) // error 이벤트가 방출될때 Swift.Error을 정의한 에러가 함께 방출된다.
  • completed

“Hot”, “Cold” Observable

두가지 Observable의 차이점은 이벤트를 언제 방출하느냐의 차이점이다. Cold Observable은 옵저바가 구독을 하는 시점부터 이벤트을 배출하게 된다. 반대로 Hot Observable은 옵저버가 구독과 상관없이 Observable 생성 시점부터 이벤트가 방출된다.

두가지 Observable의 차이점을 이해하지 못하고 개발하다 보면 잘못된 결과값이 발생할 수도 있으니 개념을 잡는게 중요하다. 좀더 알고자 한다면 Subject에 대한 공부가 필요하다.

Operators

Transforming Observable Items

Filtering Observables

Combining Observables

Conditional and Boolean Operators

Leave a Comment

이메일은 공개되지 않습니다.

This div height required for enabling the sticky sidebar