Observable 的 RxSwift 用途
Posted
技术标签:
【中文标题】Observable 的 RxSwift 用途【英文标题】:RxSwift purpose of Observable 【发布时间】:2020-11-08 00:03:18 【问题描述】:我正在学习 RxSwift 并试图了解 Observable 和 PublishSubject aka Sequence 之间的主要区别。
据我了解,Sequences / PublishesSubject 充当 Observable 和 Observer。您可以订阅这些,如果值发生变化,它们会发出通知。 PublishesSubject 可以更改。
我的问题是,那么 Observables 的目的是什么?我只能使用just()
或from()
创建具有固定值的 Observable。但是我不能更改这些值或附加一个项目,对吧?所以我的 Observable 只会发出我在 init 中分配给它的值。当实际值是不可变的时,为什么我需要 Observable 呢?
让我们考虑一个返回Observable<UIImage>
的函数。我可以只返回一个 UIImage,而不是返回那个 Observable 然后订阅下一个。为什么需要 Observable?
如果我创建以下 Observable:
let observable = Observable.of(1,2,3)
我会有一个静态大理石图.. 我的 Observable 将发出 1,2 和 3。然后..?结束了吗?
我只是不明白为什么我应该使用 Observable。任何帮助表示赞赏。
【问题讨论】:
注意PublishSubject
是Observable
的一种(还有很多其他的),所以如果你明白PublishSubject
的目的,那就是你应该使用@987654328的一个原因@!我想你只是不确定为什么 of
和 just
存在。对吗?
【参考方案1】:
为了帮助您理解,请查看Observable.create
。你会看到它需要一个闭包。每次观察者订阅它时都会执行此闭包。
因此,如果您想使用create
实现just
,您可以执行以下操作:
func just(_ value: Int) -> Observable
return Observable.create observer in
observer.onNext(value)
observer.onCompleted()
return Disposables.create()
当然,这只会在一段时间内发出静态值,但你可以做其他事情......
let random = Observable<Int>.create observer in
observer.onNext(Int.random(in: 0..<10))
observer.onCompleted()
return Disposables.create()
上面会发出一个随机值然后完成。您也可以在关闭时发出网络请求,或者您可以在每次点击按钮时调用onNext
。 RxCocoa 已经有很多了……例如:
let result = loginButton.rx.tap
.withLatestFrom(Observable.combineLatest(usernameTextField.rx.text, passwordTextField.rx.text))
.map URLRequest.login(credentials: $0)
.flatMapLatest URLSession.shared.rx.data(request: $0)
.subscribe(onNext: print("data:", $0)
每次点击按钮时,loginButton.rx.tap
都会发出下一个事件。
每次用户在其中一个文本字段中输入数据时,usernameTextField.rx.text
和 passwordTextField.rx.text
都会发出下一个事件。
当服务器响应数据时,URLSession.shared.rx.data(request:)
会发出一个值。所有这些都是 Observables 的(形式)。
【讨论】:
【参考方案2】:如果你真的不喜欢 Subjects 的可变状态,你可以使用普通的 Observables。当您想将 ViewModel 转换为函数而不是类时,这会派上用场。
要回答您的这个具体问题,
Let´s think of a function which returns an Observable<UIImage>. Instead of returning that Observable and then subscribe on next, I can just return an UIImage. Why do I need a Observable?
答案是,想象一下您无法立即返回UIImage
的情况。这可能是网络操作或可能需要时间的昂贵绘图操作的结果。所以它必须是异步的。为了实现这一点,您可以使用Observable<UIImage>
而不是UIImage
。这样您就可以立即返回Observable<UIImage>
,但您的订阅者在实际完成处理之前不会收到UIImage
。
如果没有 Observables,您必须传递一个块才能获得相同的结果。这只是一个例子。有很多用例。
【讨论】:
这是一个很好的解释,也帮助我更好地理解它!干得好以上是关于Observable 的 RxSwift 用途的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift:延迟 observable 直到另一个 observable 完成?
RxSwift - 一个 Observable 中的多个 Observable 值
如何在 Observable.create (RxSwift) 中返回/转发一个 observable