SerialDispatchQueueScheduler !// internal serial dispatch queue of given properties let queue = DispatchQueue.global(qos: qos.qosClass) !// simplified essence of schedule method queue.async { action(state) }
OperationQueueScheduler !// operation queue provided by client in the initializer let operationQueue: OperationQueue !// simplified essence of schedule method operationQueue.addOperation( BlockOperation { action(state)) } )
Schedule-using for generation !// Scheduler to send elements on. .fromScheduled([1, 2, 3], greenScheduler) !// Scheduler to run the producer loop on. .repeatElement(1, blueScheduler) !// Scheduler to run the timer on. .interval(1, redScheduler)
Schedule-using for internal work !// Scheduler to run the throttle timers on. .throttle(1, blueScheduler) !// Scheduler to run the subscription delay timer on. .delay(1, greenScheduler) !// Scheduler to run buffering timers on. .buffer(timeSpan: 1, count: 3, scheduler: redScheduler)
One-off let serial = SerialDisposable() !// call each time you want the fresh data func fetchFreshData() { serial.disposable = observable .subscribe(onNext: { [unowned self] in self.work(on: $0) }) }
Updating let disposeBag = DisposeBag() !// call only once in the object lifetime func listenForFreshData() { observable .subscribe(onNext: { [unowned self] in self.work(on: $0) }) .disposed(by: disposeBag) }
Immediately & synchronously !// if not ready to handle data at the `subscribe` time dataProvider .data() .skip(1) .subscribe(onNext: { [unowned self] in self.work(on: $0) }) .disposed(by: disposeBag)
After some time & asynchronously !// provide separate method for fetching initial data let initialData = dataProvider.getInitialData() dataProvider .dataUpdates() .subscribe(onNext: { [unowned self] in self.work(on: $0) }) .disposed(by: disposeBag)
Not caching let observable = dataProvider .fetchHugeAmountOfDataFromNetwork() !// costly network request with fresh data observable.subscribe() !// costly network request with fresh data observable.subscribe()
Caching let observable = dataProvider .fetchHugeAmountOfDataFromNetwork() .shareReplay(1) !// costly network request with fresh data observable.subscribe() !// no network refresh but also old data observable.subscribe()
!/* Returns an Observable that emits at most three times, starting with the first event emitted immediately and synchronously upon subscription. Times of other two events are not guaranteed. May not complete, but never errors out. Doesn’t cache any data. !*/ public func thirdTimeLucky() !-> Observable