如何在RxSwift中配置Bool流

时间:2016-08-19 21:00:48

标签: ios swift rx-swift

我愿意在使用collectionView时从网络服务中提取新内容时强制重新加载RxSwift。当我的onComplete闭包被正确调用时,我无法弄清楚为什么我没有在newContent上收到带有以下代码的事件。

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)
    }
}

1 个答案:

答案 0 :(得分:2)

这是因为self?.newContent = Variable(true)正在用完全 newContent替换Variable之后已经订阅了原来在这里:

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

您的UIView中的订阅现在正在收听Observable,以致任何人都不会发送Next事件。

相反,您应该在当前(且仅限)Next newContent / Variable发送Observable事件:

self?.newContent.value = true

你可以修复它并继续使用newContent VariablereloadData来电,不过,我不建议这样做。相反,请查看RxDataSources