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,当订阅该程序时,它会发出网络请求并发出结果。