我正在学习RxSwift,在创建Observable时遇到了以下模式:
return Observable.create { observer in
let disposable = Disposables.create()
// Do some stuff with observer here
return disposable
}
据我所知,返回的Disposable实际上不做任何事情,它是否满足了API返回Disposable的要求以外的目的?
在任何情况下,您可能需要返回已配置的一次性用品?
我认为最让我困惑的是,返回的Disposable似乎与正在创建的Observable的实现是分开的,也就是说,它没有分配给任何属性,也没有传递给它刚刚创建并返回的任何地方。
答案 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)