2016-08-19 42 views
5

當使用RxSwift從Web服務提取新內容時,我願意強制重新加載collectionView。當我的onComplete閉包被正確調用時,我無法弄清楚爲什麼我沒有在newContent上收到以下代碼的事件。如何在RxSwift中配置Bool流

class ListingView : UIView { 

    var newContentStream: Observable<Bool>? 
    let disposeBag = DisposeBag() 

    @IBOutlet weak var collectionView: UICollectionView! 

    weak var viewModel: ListingViewModel? 

    func bind(viewModel: ListingViewModel) { 
     self.viewModel = viewModel 
    } 

    func configure() { 
     guard let viewModel = self.viewModel else { return } 

     self.newContentStream = viewModel.newContent.asObservable() 
     self.newContentStream!.subscribeNext { _ in 
      self.collectionView.reloadData() 
     } 
     .addDisposableTo(self.disposeBag) 
    } 
} 

,然後我的ViewModel中:

class ListingViewModel { 
    let dataSource = ListingViewDataSoure() 
    var newContent = Variable(false) 

    func mount() { 
     let onComplete : ([item]? -> Void) = { [weak self] items in 
      self?.dataSource.items = items 
      self?.newContent = Variable(true) 
     } 

     guard let URL = API.generateURL() else { return } 
     Requestor.fetchAll(onComplete, fromURL: URL) 
    } 
} 

回答

2

這是因爲self?.newContent = Variable(true)正在取代newContent具有完全Variable後,你已經訂閱了原來在這裏:

self.newContentStream = viewModel.newContent.asObservable() 
self.newContentStream!.subscribeNext { ...... 

那subscricri您的UIView現在正在收聽Observable,任何人都不會發送Next事件。然而

self?.newContent.value = true 

您可以修復它,並繼續使用newContentVariablereloadData電話,:

相反,你應該對當前散發出一股Next事件(只)newContentVariable/Observable ,我不會推薦這樣做。相反,請查看RxDataSources

+0

感謝您使用RxDataSources指點我。我怎麼能簡單地流一些布爾事件,但如果我不應該重置newContent?我可以觀察數據源嗎? – tiguero

+0

我編輯了答案,向你展示瞭如何。但是,我不會建議這樣做。 – solidcell

+0

它對您的建議很好,謝謝 - 我現在將RxDataSources視爲下一步 – tiguero