Я использую 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()
}
Это скриншот утечки памяти для будущего, созданной выше. .. Это все еще остается вокруг даже после того, как все подписчики удалены. Инструменты также показывает аналогичный график памяти. Любые мысли о том, что может быть причиной этого?