PaFi
PaFi

Reputation: 920

Future Combine sink does not recieve any values

I want to add a value to Firestore. When finished I want to return the added value. The value does get added to Firestore successfully. However, the value does not go through sink.

This is the function that does not work:

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

I made a test function that works:

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

Also I have a similar code snippet that works:

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

I tried to add a buffer but it did not lead to success.

Upvotes: 0

Views: 965

Answers (1)

Dmitriy Lupych
Dmitriy Lupych

Reputation: 639

Try to change/remove .cancel() method on your subscriptions. Seems you subscribe to the publisher, and then immediately cancel the subscription. The better option is to retain and store all your subscriptions in the cancellable set.

Upvotes: 3

Related Questions