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()
}

backup