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

Mar*_*ina 5 ios swift rx-swift

当我开始使用RxSwift时,我曾经BaseViewController使用RxSwift在我所有的控制器上创建和扩展它.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()
}
}
Run Code Online (Sandbox Code Playgroud)

我在我的子控制器中使用addSubscription(:_)方法.例如,一段代码来自:

class TasksViewController: BaseViewController{
   overrided func viewWillAppear(){
       //...
     var subscribe = dataLoader.load(requestNetwork, dataManager: taskDataManager)
    .observeOn(ConcurrentDispatchQueueScheduler(queue: queue))
    .subscribe({ (event) -> Void in
        //...

    })
    addSubscription(subscribe!)
   }
} 
Run Code Online (Sandbox Code Playgroud)

如果我不使用BaseViewController并DisposeBag()在每个控制器中创建一个实例并将我的所有订阅添加到该disposeBag,该怎么办?我应该如何对待一次性用品?

sol*_*ell 11

您只需let disposeBag = DisposeBag()向视图控制器添加属性即可.Disposable只需添加s就可以了. DisposeBag就像一个CompositeDisposeBagdisposeDisposable给你的时候DisposeBag被释放(在时会发生UIViewController被释放).无需手动管理.

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

class BaseViewController: UIViewController {
    let disposeBag = DisposeBag()
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

override func viewDidLoad() {
    super.viewDidLoad()

    Observable.just(42)
        .subscribeNext { i in
            print(i)
        }
        .addDisposableTo(disposeBag)
}
Run Code Online (Sandbox Code Playgroud)

这实际上是ViewController基类的作用RxExample:

ViewController中的属性

在子类中的用法

如果你真的想要能够手动释放所有内容(就像你正在使用的那样unsubscribeAll),那么你可以设置disposeBagto nil或new DisposeBag来解除分配:disposeBag = DisposeBag()或者disposeBag = nil.