我以这种方式定义了带有一次性 Set 的 ViewModel
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 一样,但订阅似乎仍然存在,一次性引用不会取消订阅它从网络获取数据并将它们保存在核心数据中并打印同步对象:对象, 同步对象:完成。即使我停止切换屏幕几秒钟以完成旧请求,它仍然保持活力。
我应该手动取消 AnyCancellable 吗?不应该自动取消吗?