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。任何帮助表示赞赏。

【问题讨论】:

注意PublishSubjectObservable的一种(还有很多其他的),所以如果你明白PublishSubject的目的,那就是你应该使用@987654328的一个原因@!我想你只是不确定为什么 ofjust 存在。对吗? 【参考方案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.textpasswordTextField.rx.text 都会发出下一个事件。 当服务器响应数据时,URLSession.shared.rx.data(request:) 会发出一个值。所有这些都是 Observables 的(形式)。

【讨论】:

【参考方案2】:

如果你真的不喜欢 Subjects 的可变状态,你可以使用普通的 Observables。当您想将 ViewModel 转换为函数而不是类时,这会派上用场。

要回答您的这个具体问题,

Let´s think of a function which returns an Observable&lt;UIImage&gt;. Instead of returning that Observable and then subscribe on next, I can just return an UIImage. Why do I need a Observable?

答案是,想象一下您无法立即返回UIImage 的情况。这可能是网络操作或可能需要时间的昂贵绘图操作的结果。所以它必须是异步的。为了实现这一点,您可以使用Observable&lt;UIImage&gt; 而不是UIImage。这样您就可以立即返回Observable&lt;UIImage&gt;,但您的订阅者在实际完成处理之前不会收到UIImage

如果没有 Observables,您必须传递一个块才能获得相同的结果。这只是一个例子。有很多用例。

【讨论】:

这是一个很好的解释,也帮助我更好地理解它!干得好

以上是关于Observable 的 RxSwift 用途的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:延迟 observable 直到另一个 observable 完成?

RxSwift - 一个 Observable 中的多个 Observable 值

如何在 Observable.create (RxSwift) 中返回/转发一个 observable

如何检查 RXSwift 中的 observable 是不是为空?

如何在 RxSwift 中取消订阅 Observable?

RxSwift 基于变量构建 Observable