RX Observables - 如果我不能改变价值,"over time" 有什么意义?
RX Observables - What's the point of "over time" if I can't change is value?
我正在研究 RXSwift,我对 Observables 有点困惑。我已经理解了它可以发出事件 "over time" 的理论。但是,我必须用一个值初始化它,订阅并使用该值(这是没有意义的),但我不能稍后更改该 observable 的值,所以,说它可以发出值有什么意义 "over time" ???有人可以向我澄清吗?非常感谢!
的确,您不能直接 更改 Observable
的值,因为那不是 Observable
的意义所在。在那种情况下,你可以只 return 一个值并在不使用 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 响应的结果。
它可以是 Void
,通常由 UIControl
事件引起。您可以在此处查看文档:
ControlProperty / ControlEvent
但是如果你真的需要变异,看看BehaviorRelay
。
您犯的错误是假设您必须 "initialize [an observable] with a value";你不那样做。相反,您使用 产生(零个或多个)值的过程来初始化可观察对象 .
也许具体的例子会有所帮助...
let search = searchTextField.rx.text.orEmpty.asObservable()
上面的search
变量的类型是Observable<String>
。它 "emits events over time" 当用户在文本字段中输入时。现在,通过在该可观察对象上进行一些适当的链接,代码将能够,例如,将用户对象数组过滤到名称中包含搜索文本的用户对象。
你看,searchTextField.rx.text
没有用值初始化,它是用监视用户在文本字段中输入的过程初始化的。
或者另一个例子:
let result = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://myURL.com")!))
在上面,我正在使用一个程序初始化 result
,当订阅该程序时,它会发出网络请求并发出结果。
我正在研究 RXSwift,我对 Observables 有点困惑。我已经理解了它可以发出事件 "over time" 的理论。但是,我必须用一个值初始化它,订阅并使用该值(这是没有意义的),但我不能稍后更改该 observable 的值,所以,说它可以发出值有什么意义 "over time" ???有人可以向我澄清吗?非常感谢!
的确,您不能直接 更改 Observable
的值,因为那不是 Observable
的意义所在。在那种情况下,你可以只 return 一个值并在不使用 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 响应的结果。
它可以是 Void
,通常由 UIControl
事件引起。您可以在此处查看文档:
ControlProperty / ControlEvent
但是如果你真的需要变异,看看BehaviorRelay
。
您犯的错误是假设您必须 "initialize [an observable] with a value";你不那样做。相反,您使用 产生(零个或多个)值的过程来初始化可观察对象 .
也许具体的例子会有所帮助...
let search = searchTextField.rx.text.orEmpty.asObservable()
上面的search
变量的类型是Observable<String>
。它 "emits events over time" 当用户在文本字段中输入时。现在,通过在该可观察对象上进行一些适当的链接,代码将能够,例如,将用户对象数组过滤到名称中包含搜索文本的用户对象。
你看,searchTextField.rx.text
没有用值初始化,它是用监视用户在文本字段中输入的过程初始化的。
或者另一个例子:
let result = URLSession.shared.rx.data(request: URLRequest(url: URL(string: "http://myURL.com")!))
在上面,我正在使用一个程序初始化 result
,当订阅该程序时,它会发出网络请求并发出结果。