2016-06-10 16 views
5

當我開始使用RxSwift我曾經創建BaseViewController,並用我所有的控制器擴展它,我使用RxSwift。 BaseViewController.swift的代碼:如何使用RxSwift處理項目中的一次性使用問題?

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?我應該如何正確處理一次性用品?

回答

8

您可以將let disposeBag = DisposeBag()屬性添加到您的視圖控制器。只需要添加Disposable即可。 DisposeBag就像是一個CompositeDisposeBag那將爲disposeDisposable s爲你當DisposeBag被釋放(這將發生在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做),那麼你可以設置disposeBagnil或新DisposeBag使其得到釋放:disposeBag = DisposeBag()disposeBag = nil

+0

非常感謝。也許你可以建議一些關於RxSwift的教程?因爲關於這個問題的信息很少。 – Marina

+0

是的。查看RxSwift repo中名爲「RxExample」的示例應用程序。只需在模擬器中運行它。此外,RxSwift回購有一些很棒的遊樂場頁面,並帶有大多數運營商的小例子。 – solidcell

+0

@Marina這個系列它是一個很好的介紹RxSwift在4後http://www.thedroidsonroids.com/blog/ios/rxswift-by-examples-1-the-basics/ –