Как отменить один определенный AnyCancellable в наборе <AnyCancellable>? - PullRequest
1 голос
/ 01 мая 2020

У меня есть URLSession.shared.dataTaskPublisher, который я храню в наборе AnyCancellable -s. Когда я получаю значение и после этого завершения, я хочу, чтобы этот AnyCancellable был удален из набора.

Как мне определить этот определенный AnyCancellable и как его удалить? Или как лучше всего справиться с этими случаями? Я проверил, и он не вынимается из сумки автоматически после получения значения завершения.

class RandomClass {
    private var cancellableBag: Set<AnyCancellable>()

    func someMethod() {
        let request = URLRequest(...)
        URLSession.shared.dataTaskPublisher(for: request)
            .sink(...)
            .store(in: &self.cancellableBag)
    }
}

1 Ответ

1 голос
/ 01 мая 2020

Здесь возможен подход. Протестировано с Xcode 11.4

class RandomClass {
    private var cancellableBag = Set<AnyCancellable>()

    func someMethod() {
        let request = URLRequest(...)

        var cancellable: AnyCancellable? = nil
        cancellable = URLSession.shared.dataTaskPublisher(for: request)
            // .. other operators here
            .sink(receiveValue: {[weak self] value in
                // ... process value here
                self?.cancellableBag.remove(cancellable!)  // << remove !!
            })
        self.cancellableBag.insert(cancellable!)     // << store !!
    }
...