テーブル行の選択時にバックグラウンドで複雑な計算を実行しようとしていますが、UIがフリーズします。私のコードを見て、何が悪いのか教えてください。
tableView.rx
.modelSelected(Sring.self)
.flatMap { item -> Observable<String> in
for _ in 1...2_500 {
for _ in 1...1_000 {
}
}
return Observable.just("Hello world!")
}
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)
.retry()
.subscribe(onNext: { value in
print(value)
})
.disposed(by: bag)
このコードで最初に理解subscribeOn
することは、値が発行されるスレッドではなく、オブザーバブルのイベントジェネレーターが呼び出されるスレッドを決定することです。それが加入しています同じスレッド上のソース観察可能発するが、その後、あなたのコードは、働いていた場合(たとえば、あなたが使用していた場合Observable.just(_:)
。しかしmodelSelected
発するにかかわらず、それは。に加入したスレッドどのように、メインスレッド上でflatMap
、オペレータは上の閉鎖を呼び出しますソースが発行したスレッドで、メインスレッドにもあります。
これらすべての結果として、を呼び出すことはめったに役に立ちませんsubscribeOn(_:)
。それが実際にあなたが期待することをするのは、究極のソース(最も上流にあるもの)のObservableのジェネレーターが同期のブロッキング関数である場合だけです。(これはそうではありませんtableView.rx.modelSelected(String.self)
)
この場合に必要なのは、次のようなものです。
tableView.rx.modelSelected(String.self)
.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.flatMap { item -> Observable<String> in
sleep(3)
return Observable.just("Hello world!")
}
.retry()
.observeOn(MainScheduler.instance)
.subscribe(onNext: { value in
print(value)
})
.disposed(by: bag)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加