我正在学习RXSwift,对Observables有点困惑。我已经理解了这个理论,它可以"随着时间的推移"发出事件。但是,我必须用一个值初始化它,订阅并使用这个值(这是毫无意义的),但我以后不能更改可观察到的值,那么,说它可以"随着时间的推移"发出值有什么意义呢???有人能向我澄清一下吗?非常感谢!
确实不能直接更改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
。
您所犯的错误是假设您必须"用值初始化[可观察的]";你不会那样做的。相反,您可以使用过程初始化可观察项,该过程会产生(零个或多个)值。
也许具体的例子会有所帮助。。。
let search = searchTextField.rx.text.orEmpty.asObservable()
上面的search
变量属于Observable<String>
类型。当用户在文本字段中键入时,它"随着时间的推移发出事件"。现在,通过对可观察到的内容进行适当的链接,例如,代码将能够过滤一组用户对象,使其仅限于那些名称中包含搜索文本的用户。
您可以看到,searchTextField.rx.text
不是用值初始化的,而是用一个过程初始化的,该过程监视用户对文本字段的输入。
或者另一个例子:
let result = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://myURL.com")!))
在上面的文章中,我使用一个过程初始化result
,当订阅该过程时,它将发出网络请求并发出结果。