首页 > 解决方案 > 为什么 BindableObject.didChange 必须是 Subject?

问题描述

为什么 BindableObject.didChange 必须是 Subject?为什么不能简单的组合其他出版商?

我正在尝试实现 BindableObject 协议。

我有两个出版商:我的模型(电影)和最新的错误。我希望 didChange 在其中任何一个发生时发出新元素。

这就是我与 Publisher 的关系:

@Published var movies: [Movie] = []
//@Published var latestError: Error? = nil is not working
let latestError = CurrentValueSubject<Error?, Never>(nil)
...
var didChange: AnyPublisher<Void, Never> {
        return $movies.map { _ -> Void in return () }
            .merge(with: latestError.map { _ -> Void in return () })
            .receive(on: RunLoop.main)
            .eraseToAnyPublisher()
    }

当我设置电影时didChange不会发出新事件,或者至少我的视图没有刷新。

但是当我使用主题时它可以工作:

let didChange = PassthroughSubject<Void, Never>()

    init() {
        $movies
            .map { _ -> Void in return () }
            .merge(with: latestError.map { _ -> Void in return () })
            .receive(on: RunLoop.main)
            .eraseToAnyPublisher()
            .subscribe(didChange)
            .store(in: &disposeBag)
    }

标签: iosswiftswiftui

解决方案


推荐阅读