【发布时间】:2021-04-09 12:03:15
【问题描述】:
嗨,所以我正在尝试用 Combine 的 Future/Promise 包装一个异步网络请求。
我的代码是这样的:
enum State {
case initial
case loading
case success(movies: [Movie])
case error(message: String)
}
protocol ViewModelProtocol {
var statePublisher: AnyPublisher<State, Never> { get }
func load(genreId: String)
}
class ViewModel: ViewModelProtocol {
var remoteDataSource = RemoteDataSource()
@Published state: State = .initial
var statePublisher: AnyPublisher<State, Never> { $state.eraseToAnyPubliher() }
public func load(genreId: String) {
self.state = .loading
self.getMovies(for: genreId)
.sink { [weak self] (moveis) in
guard let self = self else { return }
if let movies = movies {
self.state = .success(movies: movies)
} else {
self.state = .error(message: "failed to load movies")
}
}
}
func getMovies(for genreId: String) -> AnyPublisher<[Movie]?, Never> {
Future { promise in
self.remoteDataSource.getMovies(for: genreId) { (result) in
switch result {
case .success(let movies): promise(.success(movies))
case .failure: promise(.success(nil))
}
}
}.eraseToAnyPublisher()
}
}
我试图查看是否有任何内存泄漏,发现有一个未释放的对 Future 的引用 和这里一样:Combine Future Publisher is not getting deallocated
【问题讨论】:
-
代码量不足以重现内存泄漏。如果您不确定如何在链接到的答案中应用该建议,他们的建议是将
Future包装在Deferred发布者中:Deferred { Future { ...} }.eraseToAnyPublisher()。但同样 - 在这里还不足以得出结论这是否会解决您的内存泄漏 -
嘿@NewDev 感谢重播,我添加了使用它的其余代码,其余的只是视图控制器绑定到状态变量并相应地渲染屏幕
标签: ios swift memory-leaks combine