Future Combine 接收器不接收任何值

Future Combine sink does not recieve any values

我想为 Firestore 添加一个值。完成后我要return增加价值。该值确实已成功添加到 Firestore。但是,该值不会通过接收器。

这是不起作用的功能:

func createPremium(user id: String, isPremium: Bool) -> AnyPublisher<Bool,Never> {
    let dic = ["premium":isPremium]
    return Future<Bool,Never> { promise in
        self.db.collection(self.dbName).document(id).setData(dic, merge: true) { error in
            if let error = error {
                print(error.localizedDescription)
            } else {
                /// does get called
                promise(.success(isPremium))

            }
        }
    }.eraseToAnyPublisher()
}

我做了一个有效的测试函数:

func test() -> AnyPublisher<Bool,Never> {
    return Future<Bool,Never> { promise in
        promise(.success(true))
    }.eraseToAnyPublisher()
}


    premiumRepository.createPremium(user: userID ?? "1234", isPremium: true)
        .sink { receivedValue in
            /// does not get called
            print(receivedValue)
    }.cancel()

    test()
        .sink { recievedValue in
            /// does get called
            print("Test", recievedValue)
    }.cancel()

我也有一个类似的有效代码片段:

func loadExercises(category: Category) -> AnyPublisher<[Exercise], Error> {
    let document = store.collection(category.rawValue)
    return Future<[Exercise], Error> { promise in
        document.getDocuments { documents, error in
            if let error = error {
                promise(.failure(error))
            } else if let documents = documents {
                var exercises = [Exercise]()
                for document in documents.documents {
                    do {
                        let decoded = try FirestoreDecoder().decode(Exercise.self, from: document.data())
                        exercises.append(decoded)
                    } catch let error {
                        promise(.failure(error))
                    }
                }
                promise(.success(exercises))
            }
        }
    }.eraseToAnyPublisher()
}

我尝试添加缓冲区,但没有成功。

尝试对您的订阅使用 change/remove.cancel() 方法。似乎您订阅了发布者,然后立即取消了订阅。更好的选择是将所有订阅保留并存储在可取消集中。