2017-08-23 183 views
0

我在viewWillAppear中写了一个订阅。
但它也运行在第一次启动应用程序。
当我推到另一个viewcontroller,我使用dispose()。
然后我回到第一个视图控制器,我在viewWillAppear的订阅func不运行。
我的rx订阅有什么问题?为什么RxSwift订阅只在第一次启动viewWillAppear运行一次?

var listSubscribe:Disposable? 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    listSubscribe = chatrooms.notifySubject.subscribe({ json in 
     print("*1") //just print once in first launch 
     self.loadContents() 
    }) 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    let controllers = tabBarController?.navigationController?.viewControllers 
    if (controllers?.count)! > 1 { 
     listSubscribe?.dispose() 
    } 
} 

回答

0

RxSwift文件说"Note that you usually do not want to manually call dispose; this is only an educational example. Calling dispose manually is usually a bad code smell."

通常情况下,你应该做这样的事情 -

let disposeBag = DisposeBag() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     whatever.subscribe(onNext: { event in 
     // do stuff 
     }).disposed(by: self.disposeBag) 

    } 

至于你的问题,我相信你不需要重新订阅因为你订阅将保持活跃状态​​,'notifySubject'会在您有任何更新时向您发送更新。

0

也许你可以得到一些被动的执行viewWillAppear和类似的功能?而忘记了手动一次性处理...例如您UIViewControllerinit将包含这样的事情:

rx.driverViewState() 
    .asObservable() 
    .filter({ $0 == .willAppear }) 
    .take(1) // if you need only first viewWillAppear call 
    .flatMapLatest({ _ in 
     // Do what you need 
    }) 

driverViewState实现:

public extension UIViewController { 

    public enum ViewState { 
     case unknown, didAppear, didDisappear, willAppear, willDisappear 
    } 
} 

public extension Reactive where Base: UIViewController { 

    private typealias _StateSelector = (Selector, UIViewController.ViewState) 
    private typealias _State = UIViewController.ViewState 

    private func observableAppearance(_ selector: Selector, state: _State) -> Observable<UIViewController.ViewState> { 
     return (base as UIViewController).rx 
      .methodInvoked(selector) 
      .map { _ in state } 
    } 

    func driverViewState() -> Driver<UIViewController.ViewState> { 
     let statesAndSelectors: [_StateSelector] = [ 
      (#selector(UIViewController.viewDidAppear(_:)), .didAppear), 
      (#selector(UIViewController.viewDidDisappear(_:)), .didDisappear), 
      (#selector(UIViewController.viewWillAppear(_:)), .willAppear), 
      (#selector(UIViewController.viewWillDisappear(_:)), .willDisappear) 
     ] 
     let observables = statesAndSelectors 
      .map({ observableAppearance($0.0, state: $0.1) }) 
     return Observable 
      .from(observables) 
      .merge() 
      .asDriver(onErrorJustReturn: UIViewController.ViewState.unknown) 
      .startWith(UIViewController.ViewState.unknown) 
      .distinctUntilChanged() 
    } 
} 
相关问题