【问题标题】:RxSwift purpose of ObservableObservable 的 RxSwift 用途
【发布时间】: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 存在。对吗?

标签: swift rx-swift


【解决方案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,您必须传递一个块才能获得相同的结果。这只是一个例子。有很多用例。

    【讨论】:

    • 这是一个很好的解释,也帮助我更好地理解它!干得好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多