如何使用 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()
属性 添加到您的视图控制器。您只需添加 Disposable
s 即可。 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
中所做的:
如果您真的希望能够手动释放所有内容(就像您对 unsubscribeAll
所做的那样),那么您可以将 disposeBag
设置为 nil
或new DisposeBag
以便它被释放:disposeBag = DisposeBag()
或 disposeBag = nil
.
当我开始使用 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()
属性 添加到您的视图控制器。您只需添加 Disposable
s 即可。 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
中所做的:
如果您真的希望能够手动释放所有内容(就像您对 unsubscribeAll
所做的那样),那么您可以将 disposeBag
设置为 nil
或new DisposeBag
以便它被释放:disposeBag = DisposeBag()
或 disposeBag = nil
.