RX Observables - 如果我不能改变价值,那么“随着时间的推移”有啥意义?

Posted

技术标签:

【中文标题】RX Observables - 如果我不能改变价值,那么“随着时间的推移”有啥意义?【英文标题】:RX Observables - What's the point of "over time" if I can't change is value?RX Observables - 如果我不能改变价值,那么“随着时间的推移”有什么意义? 【发布时间】:2019-01-28 02:18:51 【问题描述】:

我正在研究 RXSwift,但我对 Observables 有点困惑。我已经理解了这个理论,它可以“随着时间的推移”发出事件。但是,我必须用一个值初始化它,订阅并使用该值(这是没有意义的),但是我不能稍后更改该 observable 的值,所以,说它可以“随着时间的推移”发出值有什么意义呢? ??有人可以向我澄清吗?非常感谢!

【问题讨论】:

没有什么说你必须用一个值来初始化它们。 Observables 可以在(可能)完成或因错误失败之前返回零个或多个值。 【参考方案1】:

确实,您不能直接更改Observable 的值,因为这不是Observable 的意义所在。在这种情况下,您可以只返回一个值并内联改变它而不使用 observable。

将 observable 简单地视为按时间排序的一系列事件。在序列数据结构上,您不是直接操作/改变其中的内容,您通常所做的是将它们映射到其他东西,根据特定条件过滤要排除的事件,或将它们与另一个序列组合。

比如你可以map这些事件可以描述为e(t),用横线代表时间的流逝。

--1--2--3--4--5--6--|

成倍数:

func duplicate(event: Int) -> Int 
    return event * 2


--2--4--6--8--10--12--|

之后,filter他们

func clip(event: Int) -> Int 
    return event < 10


--2--4--6--8--|

然后,将这些序列视为任何类型的序列,它可以是来自您链接在一起的多个请求的多个 HTTP 响应的结果。

它可以是通常由UIControl 事件产生的Void。您可以在此处查看文档:

ControlProperty / ControlEvent

但是,如果您真的需要突变,请查看BehaviorRelay

【讨论】:

感谢您的回答,杰西!【参考方案2】:

您犯的错误是假设您必须“用一个值初始化 [an observable]”;你不要那样做。相反,您使用产生(零个或多个)值的过程来初始化一个可观察对象

也许具体的例子会有所帮助......

let search = searchTextField.rx.text.orEmpty.asObservable()

上面的search 变量是Observable&lt;String&gt; 类型。当用户在文本字段中输入时,它会“随着时间的推移发出事件”。现在,通过在该 observable 上进行一些合适的链接,代码将能够,例如,将一组用户对象过滤到仅在其名称中包含搜索文本的那些人。

你看,searchTextField.rx.text 没有用值初始化,它是用一个监视用户输入文本字段的过程来初始化的。

或者另一个例子:

let result = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://myURL.com")!))

在上面,我使用一个过程初始化result,当订阅该过程时,它将发出网络请求并发出结果。

【讨论】:

以上是关于RX Observables - 如果我不能改变价值,那么“随着时间的推移”有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIApplicationDelegate 方法转换为 RxSwift Observables

[RxJS] Use takeUntil instead of manually unsubscribing from Observables

使用 Reactive.NET RX 处理 Click 和 Double Click

rx.js Observable 剖析(创建,订阅,执行,清理 )

Angular2 Observables - 创建我自己的 - 订阅者未定义

RxJava和EventBus的区别