Observable 只发出一个值?
Posted
技术标签:
【中文标题】Observable 只发出一个值?【英文标题】:Observable only emits one value? 【发布时间】:2021-01-23 22:01:06 【问题描述】:我是 RxSwift 的新手,我在控制台中截取了这段代码:
下一个(第二个值)
完成
但我期待这个结果:
下一个(第一个值)
下一个(第二个值)
完成
为什么没有对两次订阅做出反应?我知道在反应中,当我们观察到的变量发生变化但代码没有显示这一点时,observable 会发出并触发订阅。我误解了这个概念吗?
var mutableString = "first value"
mutableString = "second value"
var stringObservable: Observable<String> = Observable.of(mutableString)
stringObservable.subscribe event in
print(event)
【问题讨论】:
【参考方案1】:程序运行时,会一步一步地遍历每一行代码。所以首先它创建变量mutableString
并为其分配“第一个值”。然后在下一行中,它将“第二个值”分配给变量。
然后它创建Observable<String>
类型的变量stringObservable
并将Observable.of(mutableString)
分配给它,因为mutableString 包含“第二个值”,这就是分配Observable 内部的值。
请注意,Observable 内部有自己的变量,因此更改 mutableString
的值不会影响 Observable。
要获得您正在寻找的输出,您需要在创建时传递您希望 Observable 输出的所有值,如下所示:
let stringObservable: Observable<String> = Observable.of("first value", "second value")
stringObservable.subscribe event in
print(event)
另一种选择是创建一个具有输出值的函数的 Observable:
func makeObservable(from array: [String]) -> Observable<String>
Observable<String>.create observer in
for each in array
observer.onNext(each)
observer.onCompleted()
return Disposables.create()
这基本上就是 Observable 的 of(_:)
操作符的实现方式。每次订阅生成的 Observable 时,它都会运行传递给 create
函数的闭包,导致它再次发出两个值(以及完成的事件)。
【讨论】:
感谢您的回复,现在我看到了我修改变量而不是可观察对象本身的问题。更多人认为有一种方法可以将元素添加到可观察对象,但不在 create 或 of 中,我的意思是在 of 或 create 中使用一些值初始化观察,然后在代码中添加更多值,执行类似 stringObservable.value = 的操作“第三个元素”或StringObservable.onNext(“第三个元素”),我看到有些人后来使用了一个变量,他们用asObservable()进行了转换,并且可以做像StringObservable.value =“第三个元素”这样的事情Observables可能不允许? 您可以使用Subject
并在主题上调用 asObservable()
以从中获取 observable(Variable
是一种未弃用的主题形式。)主题提供了方便戳 Rx 的方法,但不建议将它们用于日常使用。最好是建立一个不变量,它会导致 Observable 发出值,而不是没有特定原因发出的东西。以上是关于Observable 只发出一个值?的主要内容,如果未能解决你的问题,请参考以下文章
在发出两个 observable 的第一个值后,Zip 没有发出值
RxJs。如果我有两个 observable,如何抛出错误并继续发出值?