首页 > 解决方案 > 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 也展示了类似的内存图。关于可能导致这种情况的任何想法?

在此处输入图像描述

标签: iosswiftcombine

解决方案


Future 在创建时立即调用它的闭包,这可能会影响这一点。您可以尝试将 Future 包装在Deferred中,以便在订阅发生之前不会创建它(这可能是您在扫描代码时所期望的)。

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


推荐阅读