用RxSwift阻塞线程

时间:2019-02-25 11:13:33

标签: ios swift multithreading rx-swift

下面是我正在努力的项目的简化版本。

我想阻塞线程,直到第一个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

1 个答案:

答案 0 :(得分:1)

subscribeOn运算符影响生产者开始的线程,即,运行print语句的线程,但不影响DispatchQueue运行的线程。因此,将打印第一个调用,将块推入主调度队列,然后完成。然后,第二个调用执行相同操作。然后派遣火力。

您可以通过多种方式来解决问题,具体取决于您对生产者函数中的代码拥有多少控制权:

  • 以顺序格式而不是调度方式编写生产函数。

  • 将调度程序传递到您的returnSingle函数中,然后使用它代替DispatchQueue。

  • 对对象进行所有操作,然后对对象的发射进行concatMap。