如何防御性地创建Rx Observable并避免竞争条件?

时间:2017-02-16 07:46:33

标签: swift concurrency rx-swift defensive-programming

我正在寻找一个奇怪的边缘情况,目录中的文件列表没有显示0 ... 2文件的结果,但是对于3 ... n文件工作正常。

事实证明原始的可观察序列工作得很好。但我在一个订阅者中使用PublishSubject来传递更改的效果。据报道所有这些都发生在主队列上,但似乎PublishSubject在拥有订阅者之前得到了值。 (由于没有重播,订阅者不会知道。)

因此,所有组件(源 - 中继用户 - 消费用户)的设置似乎已将 time 作为一个问题引入。

奇怪的观察:

  • 如果我将原始Observable设为Driver,那么事情就可以了。
  • 如果我在原始链中的某个地方插入.observeOn(MainScheduler.instance)(在转发订阅者之前),事情就可以了。即使我可以在地图操作中看到断点的使用,映射也已经发生在com.apple.main-queue (serial)上。
  • 如果我在原点或订阅者代码中使用.subscribeOn(MainScheduler.instance),我仍然会遇到问题。 (可能是因为它起源只影响转发用户,后来为时已晚。)

现在我不明白如何在防守方面处理这些问题。

似乎PublishSubject可能不适合这种情况。但为什么观察主队列会改善这种情况呢?

你应该(防御性地)在创建/生产时指定在主队列上运行的可观察序列吗?(同样,这可能是一个实用的修复,但它只是不小心似乎解决了这个问题。)

或者换句话说,何时应该假设消费者的代码中没有及时发生的事情,即订阅设置何时?

我没办法告诉从输入序列到PublishSubject的中继事件导致了麻烦。它是不可察觉的。让我困惑如何避免这样的错误。

0 个答案:

没有答案