RxSwfit: Scheduler

什么是 Scheduler ?

Scheduler 就是一個程序上下文發(fā)生的地方,它可以是一個線程,一個 dispatch queue 或者 NSOperation,例如下面的圖片所示:

image.png

闡明 Scheduler

有一個錯誤的觀點就是 schedulers 等價于一個 thread,這樣看起來好像很合理,schedulers 就像 GCD.

但是如果以自定義 scheduler 的時候,可以創(chuàng)建多個 scheduler 使用相同的線程

explicit

這里要記住的是 schedulers 并不是線程,它也沒有和線程有一一對應的關(guān)系

下面是例子用到的一些代碼


fileprivate func secondsElapsed() -> String {
  return String(format: "%02i", Int(Date().timeIntervalSince(start).rounded()))
}

extension ObservableType {
  func dump() -> RxSwift.Observable<Self.E> {
    return self.do(onNext: { element in
      let threadName = getThreadName()
      print("\(secondsElapsed())s | [D] \(element) received on \(threadName)")
    })
  }
  
  func dumpingSubscription() -> Disposable {
    return self.subscribe(onNext: { element in
      let threadName = getThreadName()
      print("\(secondsElapsed())s | [S] \(element) received on \(threadName)")
    })
  }
}

接下來寫下如下代碼


let fruit = Observable<String>.create { (observer) -> Disposable in
    observer.onNext("[apple]")
    sleep(2)
    observer.onNext("[pineapple]")
    sleep(2)
    observer.onNext("[strawberryy]")
    return Disposables.create()
}

輸入如下


00s | [D] [apple] received on Main Thread
00s | [S] [apple] received on Main Thread
02s | [D] [pineapple] received on Main Thread
02s | [S] [pineapple] received on Main Thread
04s | [D] [strawberryy] received on Main Thread
04s | [S] [strawberryy] received on Main Thread

使用 subscribeOn

有時候要改變 schedule 的 observable 的運行的地方。創(chuàng)建一個 scheduler,然后改成如下代碼

let globalScheduler = ConcurrentDispatchQueueScheduler(queue: DispatchQueue.global())

fruit
    .subscribeOn(globalScheduler)
    .dump()
    .dumpingSubscription()
    .addDisposableTo(bag)
    
RunLoop.main.run(until: Date(timeIntervalSinceNow: 13))
    

輸出如下

00s | [D] [apple] received on Anonymous Thread
00s | [S] [apple] received on Anonymous Thread
02s | [D] [pineapple] received on Anonymous Thread
02s | [S] [pineapple] received on Anonymous Thread
04s | [D] [strawberryy] received on Anonymous Thread
04s | [S] [strawberryy] received on Anonymous Thread

使用 observeOn

把代碼改成如下:

fruit
    .subscribeOn(globalScheduler)
    .dump()
    .observeOn(MainScheduler.instance)
    .dumpingSubscription()
    .addDisposableTo(bag)
    

輸出:

00s | [D] [apple] received on Anonymous Thread
00s | [S] [apple] received on Main Thread
02s | [D] [pineapple] received on Anonymous Thread
02s | [S] [pineapple] received on Main Thread
04s | [D] [strawberryy] received on Anonymous Thread
04s | [S] [strawberryy] received on Main Thread


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容