RxSwift

时间:2018-08-31 13:47:52

标签: ios swift rx-swift

我正在学习RxSwift,在创建Observable时遇到了以下模式:

return Observable.create { observer in

    let disposable = Disposables.create()

    // Do some stuff with observer here

    return disposable
}

据我所知,返回的Disposable实际上不做任何事情,它是否满足了API返回Disposable的要求以外的目的?

在任何情况下,您可能需要返回已配置的一次性用品?

我认为最让我困惑的是,返回的Disposable似乎与正在创建的Observable的实现是分开的,也就是说,它没有分配给任何属性,也没有传递给它刚刚创建并返回的任何地方。

2 个答案:

答案 0 :(得分:5)

Disposables.create函数采用可选的闭包。您应该在该闭包中放入任何取消代码。如果您无法取消,则该代码为空。

一个很好的例子是URLSession的{​​{1}}方法的包装器。在非Rx代码中,当您调用dataTask时,它将返回一个URLRequest.shared.dataTask对象,该对象可用于取消网络呼叫。该对象的URLSessionDataTask函数在一次性对象中被调用。

另一个常见的用法是当您从create闭包中订阅其他可观察的对象时。然后,您必须通过返回cancel来从该订阅/那些订阅中除去一次性订阅,以便在处理Observable时正确取消这些订阅。

答案 1 :(得分:2)

create相关的Disposables方法有两种变体。

第一个,如Daniel提到的,在创建新的Observable时使用。基本上,您将使用Disposables.create { ... }闭包来“进行清理”。

这在使用flatMapLatest时非常有用,因为当有新请求进入时,先前的请求将被处置。无论何时处置,都会调用“清理”块。

Observable<Int>.create { observer in
    let someRequest = doSomeLongRunningThing { result in
        observer.onNext(result)
        observer.onCompleted()
    }

    return Disposables.create {
        // How can I "cleanup" the process?
        // Cancel the request, for example.
        someRequest.cancel()
    }
}

Disposables.create的第二个变体用于完全不同的目的-将几个Disposable对象分组为单个一次性对象(CompositeDisposable)。

例如:

let disposable1 = someAction()
let disposable2 = someOtherAction()

let compositeDisposable = Disposables.create(disposable1, disposable2)