如何使用 RxSwift 正确处理项目中的 Disposables?

How to treat Disposables correct in project with RxSwift?

当我开始使用 RxSwift 时,我曾经创建 BaseViewController 并使用我使用 RxSwift[=22= 的所有控制器扩展它]. 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()
}
}

而且我在我的子控制器中到处都使用 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 而只是在每个控制器中创建一个 DisposeBag() 的实例并将我的所有订阅添加到该 disposeBag 会怎样?我应该如何正确对待一次性用品?

您可以将 let disposeBag = DisposeBag() 属性 添加到您的视图控制器。您只需添加 Disposables 即可。 DisposeBag 就像一个 CompositeDisposeBag 会在 DisposeBag 被释放时为你 dispose Disposable(这将在 UIViewController 被释放时发生).无需手动管理。

但是,如果需要,您可以继续使用子class:

class BaseViewController: UIViewController {
    let disposeBag = DisposeBag()
}

然后使用它:

override func viewDidLoad() {
    super.viewDidLoad()

    Observable.just(42)
        .subscribeNext { i in
            print(i)
        }
        .addDisposableTo(disposeBag)
}

这实际上是 ViewController 基础 class 在 RxExample 中所做的:

property in ViewController

Usage in a subclass

如果您真的希望能够手动释放所有内容(就像您对 unsubscribeAll 所做的那样),那么您可以将 disposeBag 设置为 nil 或new DisposeBag 以便它被释放:disposeBag = DisposeBag()disposeBag = nil.