如何在RxSwift中配置Bool流

tig*_*ero 5 ios swift rx-swift

我愿意在使用collectionView时从web服务获取新内容时强制重新加载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)
    } 
}
Run Code Online (Sandbox Code Playgroud)

然后在我的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

sol*_*ell 2

这是因为在您已经订阅了原始版本之后,正在用全新self?.newContent = Variable(true)替换:newContent Variable

self.newContentStream = viewModel.newContent.asObservable()
self.newContentStream!.subscribeNext { ......
Run Code Online (Sandbox Code Playgroud)

您的订阅UIView现在正在监听一个Observable没有人会发送Next事件的事件。

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

self?.newContent.value = true
Run Code Online (Sandbox Code Playgroud)

您可以修复它并继续使用 anewContent Variable和 areloadData调用,但是,我不建议这样做。相反,请查看RxDataSources.