2016-06-10 13 views
5

Quando ho iniziato a usare RxSwift Ero solito creare BaseViewController ed estenderlo con tutti i miei controller dove utilizzo RxSwift. Il codice di BaseViewController.swift:Come trattare gli articoli monouso corretti nel progetto con 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() 
} 
} 

E io uso AddSubscription (: _) Metodo ovunque nei miei controllori bambino. Per esempio un pezzo di codice da:

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

    }) 
    addSubscription(subscribe!) 
    } 
} 

Che cosa succede se io non uso BaseViewController e basta creare un'istanza di DisposeBag() in ogni controller e aggiungere tutti i miei abbonamenti a che disposeBag? E come devo trattare i Monouso corretti?

risposta

8

È possibile aggiungere una proprietà let disposeBag = DisposeBag() ai controller di visualizzazione. L'aggiunta di Disposable s è tutto ciò che devi fare. DisposeBag è come un CompositeDisposeBag che sarà dispose il Disposable s per voi quando DisposeBag è deallocato (che si verificherà quando lo UIViewController è deallocato). Non è necessario gestirlo manualmente.

Tuttavia, è possibile continuare a utilizzare una sottoclasse se si voleva:

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

E poi usarlo:

override func viewDidLoad() { 
    super.viewDidLoad() 

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

Questo è infatti ciò che ViewController classe base fa in RxExample:

property in ViewController

Usage in a subclass

Se si sta in realtà vogliono essere in grado di rilasciare tutto manualmente (come facevi con unsubscribeAll), allora si può solo impostare il disposeBag-nil o un nuovo DisposeBag in modo che venga deallocata: disposeBag = DisposeBag() o disposeBag = nil.

+0

Grazie mille. Forse puoi consigliare alcuni tutorial su RxSwift? Perché ci sono poche informazioni su questo argomento. – Marina

+0

Sì, sicuramente. Controlla l'app di esempio nel repository RxSwift chiamato "RxExample". Basta eseguirlo nel simulatore. Inoltre, il repository RxSwift ha alcune fantastiche pagine Playground con piccoli esempi della maggior parte degli operatori. – solidcell

+0

@Marina Questa serie è un'ottima introduzione a RxSwift in 4 post http://www.thedroidsonroids.com/blog/ios/rxswift-by-examples-1-the-basics/ –

Problemi correlati