下面是我正在努力的项目的简化版本。
我想阻塞线程,直到第一个Single
成功。
这些可观察对象应该是两个分开的流,但共享一个线程。
您是否有解决此代码的想法?谢谢!
let disposeBag = DisposeBag()
var hasReturnedSingle = false
func returnSingle() -> Single<String> {
return Single<String>.create { single in
print("hasReturnedSingle: \(hasReturnedSingle)")
DispatchQueue.main.asyncAfter(deadline: .now()+3.0) {
single(.success(()))
hasReturnedSingle = true
}
return Disposables.create()
}
}
returnSingle().asObservable()
.subscribeOn(MainScheduler.instance)
.asSingle()
.subscribe()
.disposed(by: disposeBag)
returnSingle().asObservable()
.subscribeOn(MainScheduler.instance)
.asSingle()
.subscribe()
.disposed(by: disposeBag)
结果:
hasReturnedSingle: false
hasReturnedSingle: false
期望:
hasReturnedSingle: false
hasReturnedSingle: true
答案 0 :(得分:1)
subscribeOn
运算符影响生产者开始的线程,即,运行print语句的线程,但不影响DispatchQueue运行的线程。因此,将打印第一个调用,将块推入主调度队列,然后完成。然后,第二个调用执行相同操作。然后派遣火力。
您可以通过多种方式来解决问题,具体取决于您对生产者函数中的代码拥有多少控制权:
以顺序格式而不是调度方式编写生产函数。
将调度程序传递到您的returnSingle
函数中,然后使用它代替DispatchQueue。
对对象进行所有操作,然后对对象的发射进行concatMap。