RxSwift - 如果行为主体同时从不同线程接收到 2 个值怎么办?

发布于 2025-01-11 04:15:37 字数 70 浏览 0 评论 0原文

我的两个主题在不同的线程上运行网络调用,一旦他们获取数据,就会更新另一个主题。我的问题是,如果它们同时向主题发送值会发生什么?

Two of my subjects running network calls on separate threads will update another subject once they fetch their data. My question is, what would happen if they both send a value to the subject at the exact same time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔嚣张 2025-01-18 04:15:37

Rx简介一书中:

避免使用主题类型。 Rx 实际上是一种函数式编程范例。使用主体意味着我们现在正在管理状态,这可能会发生变化。同时处理变化状态和异步编程是非常困难的。此外,许多运算符(扩展方法)都经过精心编写,以确保维护订阅和序列的正确且一致的生命周期;当你引入主题时,你可以打破这个。

IE,主题不是线程安全的。如果您从两个不同的线程对主题调用 on(_:) ,它们可能会导致同步异常并破坏可观察序列语法。

换句话说,您面临着竞争条件的风险。最好的情况是,您在调试模式下只会收到警告。最坏的情况是,您的应用程序以某种神秘且无法识别的方式崩溃,远离问题实际发生的地方。

书中的另一句话:

主题提供了一种方便的方式来探索 Rx,但是不建议日常使用它们...不要使用主题,而应该使用工厂方法...

From the book Intro to Rx:

Avoid the use of the subject types. Rx is effectively a functional programming paradigm. Using subjects means we are now managing state, which is potentially mutating. Dealing with both mutating state and asynchronous programming at the same time is very hard to get right. Furthermore, many of the operators (extension methods) have been carefully written to ensure that correct and consistent lifetime of subscriptions and sequences is maintained; when you introduce subjects, you can break this.

IE, Subjects are not thread safe. If you call on(_:) on a Subject from two different threads, they can cause a synchronization anomaly and break the observable sequence grammar.

In other words, you are risking a race condition. Best case, you just get a warning while in debug mode. Worst case, your app crashes in some mysterious unidentifiable way, far from where the problem actually occurred.

Another quote from the book:

Subjects provide a convenient way to poke around Rx, however they are not recommended for day to day use... Instead of using subjects, favor the factory methods...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文