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<String>
类型。当用户在文本字段中输入时,它会“随着时间的推移发出事件”。现在,通过在该 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 剖析(创建,订阅,执行,清理 )