RxSwift + MVVM
RxSwift(35). Driver, Signal
RxCocoa가 제공하는 Traits중에서 가장 핵심적인것은 Driver이다. Driver는UI를 Bind하는 직관적이고 효율적인 방법을 제공한다. Driver는 특별한 옵저버블이고 UI처리에 특화된 몇 가지 특징을 가지고 있다. 1. 에러메세지를 전달하지 않는다. 오류로 인해 UI처리가 중단되는 상황은 발생하지 않는다. 2. 스케쥴러를 강제로 변경하는 경우를 제외하고 항상 메인 스케쥴러에서 작업을 수행한다. 이벤트는 항상 메인스케쥴러에서 전달되고 이어지는 작업 역시 메인스케쥴러에서 실행된다. 3. 드라이버는 사이드이펙트를 공유한다. 일번옵저버블에서 쉐어연산자를 호출하고 .whileConnect연산자를 호출한것과 동일하다. 모든구독자가 시퀀스를 공유하고 새로운 구독이 시작되면 가장 최근에 전달된 이벤트가..
RxSwift(31). ErrorHandling, (Catch, catchAndReturn), retry
ErrorHandling 옵저버블에서 에러가 발생하면 에러이벤트가 발생하고 구독자는 더이상 새로운 이벤트를 받지 못한다. 예를들어 옵저버블이 네트워크요청을 처리하고 구독자가 UI를 업데이트하는 패턴를 생각해본다. 보통 UI를 업데이트 하는 코드는 NextEvent에서 처리하는데 EE가 전달되게되면 구독이 종료되고 더이상 NE가 전달되지 않는다. 그래서 UI를 업데이트하는 코드는 실행되지 않는다. RxSwift는 두 가지 방법으로 이런 문제를 해결한다. 첫 번째로 에러이벤트가 전달되면 새로운 옵저버블을 리턴한다. 여기에선 Catch연산자를 사용한다. Catch연산자는 NE와 CE는 그대로 구독자에게 전달한다. 반면 옵저버블에서 옵저버블에서 에러이벤트를 방출하면 새로운 옵저버블로 바꿔서 구독자에게 전달한다 ..
RxSwift(28). Sharing Subscription, multicast, ConnectableObservable, publish, replay
Sharing Subscription Overview 구독공유를 통해서 불필요한 작업을 방지하는 방법. let source = Observable.create { observer in let url = URL(string: "https://kxcoding-study.azurewebsites.net/api/string")! let task = URLSession.shared.dataTask(with: url) { (data, response, error) in if let data = data, let html = String(data: data, encoding: .utf8) { observer.onNext(html) } observer.onCompleted() } task.resume() return ..
RxSwift(27). interval, timer, timeout, (delay, delaySubscription)
interval 특정 주기마다 정수를 배출하는 옵저버블이 필요하면 이 연산자를 사용한다. public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Timer( dueTime: period, period: period, scheduler: scheduler ) } interval연산자는 타입메서드로 구현되어있다. 첫 번째 파라미터로 반복 주기를 받는데, RxTimeInterval은 DispatchTimeInterval과 같다. 두번째 파라미터는 정수를 방출할 스케쥴러를 지정한다. 연산자가 return하는 옵저버블은 지정된 주기마다 정수를 반복적으로 방출한다. 종료시점을 지정하지 않..
RxSwift(26). amb
amb amb는 두개이상의 소스옵저버블중에서 가장먼저 NE를 전달한 옵저버블을 구독하고 나머지는 무시한다. 마블다이어그램에서 가장먼저 NE를 전달하는것은 두번째 옵저버블이다 이 옵저버블이 전달하는 NE가 구독자에게 전달되고 나머지는 무시된다. amb연산자를 사용하면 여러 서버로 요청을 전달하고 가장 빠른 응답을 처리하는 패턴을 구현할 수 있다. public func amb (_ right: O2) -> Observable where O2.Element == Element { Amb(left: self.asObservable(), right: right.asObservable()) } 하나의 옵저버블을 파라미터로 받는다. 두 옵저버블중 가장먼저 NE를 전달하는 옵저버블을 구독하고 이옵저버블의 이벤트를 구독..