如何在 RxSwift 中配置布尔流

How to configure a Bool Stream in RxSwift

当使用 RxSwift 从 Web 服务获取新内容时,我愿意强制重新加载 collectionView。当我的 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)
    }
}

这是因为 self?.newContent = Variable(true) 正在用一个完全 new Variable, after[=37= 替换 newContent ] 你已经在这里订阅了原版:

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

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

相反,您应该在当前(且仅)newContent Variable/Observable:

发送一个 Next 事件
self?.newContent.value = true

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