ios - Combine Future Publisher 没有被释放
问题描述
我正在使用组合未来来环绕异步块操作并向该发布者添加订阅者以接收值。我注意到未来对象没有被解除分配,即使在订阅者被解除分配之后也是如此。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()
}
这是上面创建的未来泄漏内存的屏幕截图。即使订阅者全部删除,它仍然存在。Instruments 也展示了类似的内存图。关于可能导致这种情况的任何想法?
解决方案
Future 在创建时立即调用它的闭包,这可能会影响这一点。您可以尝试将 Future 包装在Deferred中,以便在订阅发生之前不会创建它(这可能是您在扫描代码时所期望的)。
它立即创建一个的事实(我认为)反映在没有订阅者时列出的对象中。
推荐阅读
- c# - 有问题字符的列名
- ssl - 如何使用客户端证书从 Kong 无服务器功能建立 SSL 连接
- python - “args”和“kwargs”哪一个在touple、list和dictionary中使用?
- android - 如何将自定义 AlertDialog 条目添加到 RecyclerView?
- java - java - 在将记录插入表之前如何处理java中的非空字段
- c# - 使用 StreamReader 读取文件时读取固定数量的字节
- wordpress - 可湿性粉剂 | 计算字段表单中的双端队列样式
- java - DAO 模式和服务层的模型对象
- javascript - Regular expression of decimal range 0.025 to 99.999
- azure - QnA Maker - 运行时错误:授权失败