Раковина Future Combine не получает никаких ценностей - PullRequest
0 голосов
/ 04 марта 2020

Я хочу добавить значение в Firestore. По окончании я хочу вернуть добавленную стоимость. Значение действительно добавляется в Firestore успешно. Однако значение не go через приемник.

Эта функция не работает:

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

Я пытался добавить буфер, но это не привело к успеху.

1 Ответ

3 голосов
/ 05 марта 2020

Попробуйте изменить / удалить метод .cancel () в своих подписках. Кажется, вы подписались на издателя, а затем сразу же отменили подписку. Лучший вариант - сохранить и сохранить все ваши подписки в отменяемом наборе.

...