ios - 为什么 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)
}
解决方案
推荐阅读
- python - 我是否使用正确的顺序进行这种细分?
- android - 如何实现类似于chrome的标签列表的堆叠/重叠recyclerview列表
- angular - 我正在使用“*ngFor”和“Keyvalue”管道迭代一个动态对象。对象有一组 obj 也需要显示
- php - php变量后无法在html链接中使用类关键字
- java - 测试顺序会影响性能结果吗?
- c# - 从固定长度的字符串映射到唯一的数字
- android - 如何从图库中选择图像并将其上传到数据库
- android - RecyclerView lateinit 属性 mClickListener 没有被初始化
- javascript - 如何忽略源自其他域链接的脚本的 TrackJS 错误?
- polymer - 有没有办法在 Polymer 1 中导入 Polymer 3 组件?