gpt4 book ai didi

multithreading - 如何在后台执行 RxSwift?

转载 作者:行者123 更新时间:2023-12-03 12:47:11 28 4
gpt4 key购买 nike

我试图在选择表行时在后台执行复杂的计算,但它卡住了 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 的事件生成器,而不是在哪个线程上发出值。如果源 Observable 在它订阅的同一个线程上发出,那么你的代码就可以工作(例如,如果你使用 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)

关于multithreading - 如何在后台执行 RxSwift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65109846/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com