RxSwift - Scheduler



Scheduler
スケジューラとは?
簡単に言えばThreadです.
メインスレッドに加え,バックグラウンドでネットワークタスクなどを非同期で処理したい場合は,マルチスレッドで分岐処理を行うことができる.
SchedulerのdefaultはMainThreadです.
Operator
スケジューラを使用するオペレータは2種類あります.

observe(on:)

  • パラメータとして指定されたスケジューラを受け入れます.

  • observe(on:)はスケジューラを変更できます.

  • 「観察」(on:)によって、オペレータの実行時に作成されるThreadの観測可能性を指定します.
  • Observable.just(“800x600”)
    .observeOn(ConcurrentDispatchQueueScheduler(qos: .default))
    .map  { $0.replacingOccurreces(of: “X”, with “ /)  } 
    .map { “https://picsum.photos/\($0)/?random” }
    .map { URL(string: $0) }
                .filter { $0 != nil }
                .map { $0! }
                .map { try Data(contentsOf: $0) }
                .map { UIImage(data: $0) }
    .observeOn(MainScheduler.instance) // MainThread로 분기처리
     .subscribe(onNext: { image in
                    self.imageView.image = image
                })
                .disposed(by: disposeBag)
     }
    サンプルコードが上に表示されている場合、observe(on:)は、その演算子が表示される下でobservableが使用するThreadに影響します.したがって、観測可能なオペレータチェーンの異なる場所で「観測」(on:)を複数回呼び出して、特定のオペレータが動作するThreadを変更できます.
    subscribe(on:)
    subscribe(on:)はobserve(on:)と似ているが,異なる性質を有する.
    呼び出しポイントが
  • であるにもかかわらず、Observableが起動するThreadを指定します.
  • 最上部の画像からも分かるように、subscribe(on:)は3番目に呼び出されますが、Threadの最初の開始はsubscribe(on:)で指定されたThreadを使用します.
  • で初めて呼び出されたスケジューラのみが使用されます.
  • [観察](on:)では、次の実行するThreadに影響を与える可能性があります.
    ex)BackgroundからMainThreadに変更
    しかし、subscribeではこれらの機能を実行できません.
    _ = Observable.create() { observer in 
    	print(Thread.inMainThread)
    	return Diposables.create()
    }
    .subscribe(on : ConcurrentDispatchQueueScheduler(qos : .background ) )
    .map { _ in 
    	print(Thread.isMainThread)
    }
    .subscribe(on : MainScheduler.instance)
    .subscribe { event in 
     	print(Thread.isMainThread)
    }
    .disposed(by : disposBag)
    //false 
    //false
    //false
    
    スケジューラのタイプ
    MainScheduler - serial
  • MainThreadでは、UI管理Threadが最も重要であり、
  • に相当する.
  • APIなどの煩雑な作業は避けなければならない.
  • MainScheduler.instance
  • 同期
  • MainScheduler.asyncInstance
  • は非同期で行うが、あまり使いにくいのは、UI操作中に突然非同期処理を行うことが少ないためであり、
  • である.

  • CurrentThreadScheduler

    現在のスレッドを使用します.


  • SeriaDispatchQueueScheduler

    DispatchQueueのシリアルQueueを使用します.
    バックグラウンドから抽出されたタスクの処理に使用します(Firebaseを使用するとサーバのエンドポイントに圧力がかかりすぎる場合があります).

  • ConcurrentDispatchQueueScheduler

    バックグラウンドでDispatchQueueのConcurrentQueueを使用します.
    シリアルDispatchQueueSchedulerなどの抽出タスクの処理に使用されますが、パラレル
    (仕事量の多い仕事に使う)

  • OperationQueue

    NSOperationQueueを使用して複雑な作業を行う場合に使用します.バックグラウンドで実行します.