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

标签 ios swift rx-swift

当我开始使用 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 中所做的:

property in ViewController

Usage in a subclass

如果您真的希望能够手动取消分配所有内容(就像您使用 unsubscribeAll 所做的那样),那么您只需将 disposeBag 设置为 nil 或一个新的 DisposeBag 以便它被释放:disposeBag = DisposeBag()disposeBag = nil

关于ios - 如何使用 RxSwift 正确处理项目中的 Disposables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37746584/

相关文章:

iphone - 如何从 appdelegate 调用方法

ios - Swift,如何调用其他 View Controller 中的函数?

ios - 用户默认值 Swift

ios - 如何解决 tableView 上下文中的 "Reactive<_>' is ambigitude"错误

ios - 使用 RxDatasources 实现多个部分

ios - 将选择器 View 设置为加载时的值

iphone - UIImagePickerController 内存泄漏

ios - 根据 IOS 版本显示不同的启动图像

ios - 如何获取 View 边距的大小?

ios - 创建可观察数组后在 RxSwift 中使用 zip 运算符