当我开始使用 RxSwift 时,我创建了 BaseViewController
并使用我使用 RxSwift 的所有 Controller 扩展它。
BaseViewController.swift 代码:
class BaseViewController: UIViewController {
var mSubscriptions: CompositeDisposable?
func addSubscription(subscription: Disposable){
if(mSubscriptions == nil){
mSubscriptions = CompositeDisposable()
}
if let mSub = mSubscriptions{
mSub.addDisposable(subscription)
}
}
func unsubscribeAll(){
if let mSub = mSubscriptions{
mSub.dispose()
mSubscriptions = nil
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
unsubscribeAll()
}
deinit{
unsubscribeAll()
}
}
我在我的子 Controller 中到处都使用 addSubscription(:_) 方法。例如一段代码来自:
class TasksViewController: BaseViewController{
overrided func viewWillAppear(){
//...
var subscribe = dataLoader.load(requestNetwork, dataManager: taskDataManager)
.observeOn(ConcurrentDispatchQueueScheduler(queue: queue))
.subscribe({ (event) -> Void in
//...
})
addSubscription(subscribe!)
}
}
如果我不使用 BaseViewController 而只是在每个 Controller 中创建一个 DisposeBag()
实例并将我的所有订阅添加到该 disposeBag 会怎样?我应该如何正确对待一次性用品?
最佳答案
你可以只添加一个 let disposeBag = DisposeBag()
属性到你的 View Controller 。您只需向其中添加 Disposable
即可。 DisposeBag
就像一个 CompositeDisposeBag
,它将在 DisposeBag
时为您处理
Disposable
被释放(这将在 UIViewController
被释放时发生)。无需手动管理。
但是,如果需要,您可以继续使用子类:
class BaseViewController: UIViewController {
let disposeBag = DisposeBag()
}
然后使用它:
override func viewDidLoad() {
super.viewDidLoad()
Observable.just(42)
.subscribeNext { i in
print(i)
}
.addDisposableTo(disposeBag)
}
这实际上是 ViewController
基类在 RxExample
中所做的:
如果您真的希望能够手动取消分配所有内容(就像您使用 unsubscribeAll
所做的那样),那么您只需将 disposeBag
设置为 nil
或一个新的 DisposeBag
以便它被释放:disposeBag = DisposeBag()
或 disposeBag = nil
。
关于ios - 如何使用 RxSwift 正确处理项目中的 Disposables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37746584/