2016-06-10 10 views
5

Als ich begann, RxSwift zu verwenden, habe ich BaseViewController erstellt und es mit allen meinen Controllern erweitert, wo ich RxSwift verwende. Der Code von BaseViewController.swift:Wie behandelt man die Disposables korrekt im Projekt mit 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() 
} 
} 

Und ich AddSubscription (_) Methode überall in meinem Kind-Controller. Zum Beispiel ein Stück Code aus:

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

    }) 
    addSubscription(subscribe!) 
    } 
} 

Was passiert, wenn ich BaseViewController nicht und nur eine Instanz von DisposeBag() in jedem Controller erstellen und fügen Sie alle meine Zeichnungen zu diesem disposeBag? Und wie sollte ich Disposables korrekt behandeln?

Antwort

8

Sie könnten einfach eine let disposeBag = DisposeBag()-Eigenschaft zu Ihren View-Controllern hinzufügen. Hinzufügen von s das ist alles, was Sie tun müssen. DisposeBag ist wie ein CompositeDisposeBag das wird dispose das s für Sie, wenn DisposeBag freigegeben wird (was passieren wird, wenn die UIViewController freigegeben wird). Sie müssen es nicht manuell verwalten.

Sie können jedoch weiterhin eine Unterklasse verwenden, wenn man will:

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

Und dann, es zu benutzen:

override func viewDidLoad() { 
    super.viewDidLoad() 

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

Dies ist in der Tat, was ViewController Basisklasse hat in RxExample:

property in ViewController

Usage in a subclass

Wenn Sie wirklich wollen, sind der Lage sein, alles freigeben manuell (wie Sie mit unsubscribeAll taten), dann können Sie nur setzen die disposeBag-nil oder eine neue DisposeBag, so dass es ausgeplant wird: disposeBag = DisposeBag() oder disposeBag = nil.

+0

Vielen Dank. Vielleicht können Sie einige Tutorials über RxSwift empfehlen? Weil es nur wenige Informationen zu diesem Thema gibt. – Marina

+0

Ja, definitiv. Sehen Sie sich die Beispiel-App im RxSwift Repo namens "RxExample" an. Führen Sie es einfach im Simulator aus. Auch das RxSwift Repo hat einige großartige Playground-Seiten mit kleinen Beispielen der meisten Betreiber. – solidcell

+0

@Marina Diese Serie ist eine ausgezeichnete Einführung in RxSwift in 4 Post http://www.thedroidsonroids.com/blog/ios/rxswift-by-examples-1-the-basics/ –

Verwandte Themen