我有一个 ViewModel,并定义了一组可处理的 Set,如下所示
class ViewModel {
private var disposables = Set<AnyCancellable>()
func sync() {
repo.syncObjects()
.handleEvents(receiveCancel: {
print("Synced objects: CANCELED!")
})
.sink(receiveCompletion: { completion in
switch completion {
case .failure(let error):
print("Synced objects: \(error)")
case .finished:
print("Synced objects: finished")
}
}) { objects in
print("Synced objects: \(objects)")
}.store(in: &disposables)
}
deinit { print("ViewModel deinit") }
}
我在SwiftUI视图的onAppear中调用了sync()。然后我快速切换屏幕,从SwiftUI视图引用的ViewModel被ARC解除引用,就像调用了deinit一样,但订阅似乎仍然存在,并且可释放的引用没有取消订阅,它从网络获取数据并将它们保存在Core Data中,并打印“已同步的对象:objects”、“已同步的对象:finished”。即使我停止几秒钟切换屏幕来完成旧请求,订阅仍然保持活动状态。
我应该手动取消AnyCancellable吗?难道它不会自动取消吗?
syncObjects
的实现方式。 - rob mayoff