gpt4 book ai didi

ios - Combine Future Publisher 没有被释放

转载 作者:行者123 更新时间:2023-12-01 21:56:54 25 4
gpt4 key购买 nike

我正在使用组合 future 来环绕异步 block 操作并向该发布者添加订阅者以接收值。我注意到 future 对象没有被解除分配,即使在订阅者被解除分配之后也是如此。 XCode 内存图和仪器泄漏图本身没有显示对这些 future 对象的引用。我很困惑他们为什么还在附近。

   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()
}
这是上面创建的 future 泄漏内存的屏幕截图。即使订阅者全部删除,它仍然存在。 Instruments 也展示了类似的内存图。关于可能导致这种情况的任何想法?
enter image description here

最佳答案

Future invokes its closure immediately upon creation ,这可能会影响这一点。您可以尝试将 Future 包裹在 Deferred 中。以便在订阅发生之前不会创建它(这可能是您通过扫描代码所期望的)。

它立即创建一个的事实(我认为)反射(reflect)在没有订阅者时列出的对象中。

关于ios - Combine Future Publisher 没有被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61128355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com