Combine:像 Future 一样的 Publisher 但有多个值
Combine: Publisher like Future but with multiple values
我的 3d 方库 (Firestore
) 具有此方法
func listenToEvents(handler: ([Result], Error) -> Void)
此方法中的 handler
被调用多次(在数据更新后)。我想将其转换为 Publisher
这是我的代码:
var resultsPublisher: AnyPublisher<[Result], Error> {
Deferred {
Future { promise in
libraryObject.listenToEvents { results, error in // called multiple times
guard let results = results else {
promise(.failure(error))
return
}
// this can't be called several times,
// because Future's promise is supposed to be called only once
promise(.success(results))
}
}
}
.eraseToAnyPublisher()
}
所以我的 Publisher
只产生一次价值,因为 Future
就是这样工作的。是否有任何其他 Publishers
(或可能是不同的方法)来实现它?
这是可能的替代方法。 Defer
中不需要,因为对象闲置,并且可以发送(传递)与 libraryObject
一样多的值。
使用 Xcode 11.4 进行测试。
var resultsPublisher: AnyPublisher<[Result], Error> {
let subject = PassthroughSubject<[Result], Error>()
libraryObject.listenToEvents { results, error in // called multiple times
guard let results = results else {
subject.send(completion: .failure(error))
return
}
subject.send(results)
}
return subject.eraseToAnyPublisher()
}
我的 3d 方库 (Firestore
) 具有此方法
func listenToEvents(handler: ([Result], Error) -> Void)
此方法中的 handler
被调用多次(在数据更新后)。我想将其转换为 Publisher
这是我的代码:
var resultsPublisher: AnyPublisher<[Result], Error> {
Deferred {
Future { promise in
libraryObject.listenToEvents { results, error in // called multiple times
guard let results = results else {
promise(.failure(error))
return
}
// this can't be called several times,
// because Future's promise is supposed to be called only once
promise(.success(results))
}
}
}
.eraseToAnyPublisher()
}
所以我的 Publisher
只产生一次价值,因为 Future
就是这样工作的。是否有任何其他 Publishers
(或可能是不同的方法)来实现它?
这是可能的替代方法。 Defer
中不需要,因为对象闲置,并且可以发送(传递)与 libraryObject
一样多的值。
使用 Xcode 11.4 进行测试。
var resultsPublisher: AnyPublisher<[Result], Error> {
let subject = PassthroughSubject<[Result], Error>()
libraryObject.listenToEvents { results, error in // called multiple times
guard let results = results else {
subject.send(completion: .failure(error))
return
}
subject.send(results)
}
return subject.eraseToAnyPublisher()
}