I want to create a Swift Combine publisher which achieves the following:
- The publisher should be triggered by changes in either Defaults (a
UserDefaults
Swift package) or changes in GRDB sqlite database values (using GRDBCombine). - The updated
UserDefaults
received from the Defaults publisher should be used within the database query in the GRDBCombine publisher.
Here is a simplified version of what I have tried so far:
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()
}
However, this publisher produces the following error (edited according to the simplified version of my publisher above):
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>'
My bet is that there is a problem with the two publishers having different values: [Task]
and Defaults.KeyChange<Int>
. However, I cannot find a way to work around this.