Издатель Combine Future не освобождается - PullRequest
0 голосов
/ 09 апреля 2020

Я использую Combine Future для обтекания асинхронной операции c и добавления подписчика к этому издателю для получения значений. Я замечаю, что будущий объект не освобождается, даже после того, как подписчики освобождены. На графике памяти XCode и графике утечек инструментов нет ссылки на эти будущие объекты. Я озадачен, почему они все еще существуют.

   func getUsers(forceRefresh: Bool =  false) -> AnyPublisher<[User], Error> {
        let future = Future<[User], Error> { [weak self] promise in
            guard let params = self?.params else {
                promise(.failure(CustomErrors.invalidData))
                return
            }

            self?.restApi.getUsers(params: params, forceRefresh: forceRefresh, success: { (users: [User]?, _) in
                guard let users = users else {
                    return promise(.failure(CustomErrors.invalidData))
                }

                promise(.success(users))
            }) { (error: Error) in
                promise(.failure(error))
            }
        }

        return future.eraseToAnyPublisher()
   }

Вот как я добавляю подписку:

   self.userDataService?.getUsers(forceRefresh: forceRefresh)
        .sink(receiveCompletion: { [weak self] completion in
            self?.isLoading = false
            if case let .failure(error) = completion {
                self?.publisher.send(.error(error))
                return
            }

            guard let users = self?.users, !users.isEmpty else {
                self?.publisher.send(.empty)
                return
            }

            self?.publisher.send(.data(users))
        }) { [weak self] (response: Array<User>) in
            self?.users = response
    }.store(in: &self.subscribers)

    deinit {
        self.subscribers.removeAll()
    }

Это скриншот утечки памяти для будущего, созданной выше. .. Это все еще остается вокруг даже после того, как все подписчики удалены. Инструменты также показывает аналогичный график памяти. Любые мысли о том, что может быть причиной этого?

enter image description here

1 Ответ

0 голосов
/ 22 апреля 2020

Будущее вызывает закрытие сразу после создания , что может повлиять на это. Вы можете попробовать обернуть Future в Deferred , чтобы он не создавался до тех пор, пока не произойдет подписка (что может быть тем, чего вы ожидаете от сканирования кода).

Тот факт, что он сразу же создает то, что (я думаю) отражается в перечисленных объектах, когда нет подписчиков.

...