2016年6月22日 星期三

筆記一下rxswift遇到disposeBag的scope問題

//userRestoreObservable被訂閱時,會去server抓東西
//原本是在DataUpdate這個struct中寫disposeBag,setupInitialInfo完會釋放裡面的observable。
//但當userRestoreObservable的next closure做完,裡面的物件都被釋放掉,
於是setupInitialInfo的disposeBag也被釋放,就接不到server回傳時的callback。
//解決方法是把disposeBag改成外部注入,讓它被宣告在closure外部,這樣才可以保證裡面的closure不會先被釋放掉。
func fetchUserByRestoreInfo(restoreInfo: RestoreInfo, completion: (()->Void)?) {
        let disposeBag = DisposeBag()
        userRestoreObservable(restoreInfo).subscribeNext { (newUserObj) in
            prettyLog(newUserObj.debugDescription)
                var userDefault = self.userDefault
                userDefault.userPackage = newUserObj
                userDefault.isNewLounch = false
                DataUpdate().setupInitialInfo(disposeBag)
                completion?()
            }.addDisposableTo(disposeBag)

    }

沒有留言:

張貼留言