我想创建一个 Swift Combine 发布者,它可以实现以下目标:
- 发布者应该由默认值(一个Swift 包)的更改或GRDB sqlite 数据库值的更改(使用GRDBCombine)触发。
UserDefaults
- 从Defaults
UserDefaults
发布者收到的更新应该在GRDBCombine发布者的数据库查询中使用。
这是我迄今为止尝试过的简化版本:
func tasksPublisher() -> AnyPublisher<[Task], Never> {
Defaults.publisher(.myUserDefault)
.flatMap { change in
let myUserDefault = change.newValue
return ValueObservation
.tracking { db in
try Task.
.someFilter(myUserDefault)
.fetchAll(db)
}
.removeDuplicates()
.publisher(in: database)
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
但是,这个发布者会产生以下错误(根据上面我的发布者的简化版本进行编辑):
Cannot convert return expression of type 'AnyPublisher<Publishers.FlatMap<_, AnyPublisher<Defaults.KeyChange<Int>, Never>>.Output, Publishers.FlatMap<_, AnyPublisher<Defaults.KeyChange<Int>, Never>>.Failure>' (aka 'AnyPublisher<_.Output, Never>') to return type 'AnyPublisher<[Task], Never>'
我敢打赌,两个发布者的值不同是有问题的:[Task]
和Defaults.KeyChange<Int>
. 但是,我找不到解决此问题的方法。