Swift 组合 Set<AnyCancellable> 如何工作?

Mic*_*bro 7 disposable subscription swift combine

我有 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") }
}
Run Code Online (Sandbox Code Playgroud)

我在 SwiftUI 视图中的 onAppear 中调用sync()。然后我快速切换屏幕,从 SwiftUI 视图引用的 ViewModel 被 ARC 释放,就像调用 deinit 一样,但订阅似乎仍然存在,一次性引用不会取消订阅,它从网络获取数据并将它们保存在 Core Data 中并打印 Synced 对象:对象,同步对象:完成。即使我停止切换屏幕几秒钟以完成旧请求,它仍然保持活动状态。

我应该手动取消 AnyCancellable 吗?不是应该自动取消吗?

Saú*_*ril 9

不,您不需要取消任何可取消的对象,因为此类对象cancel在取消初始化时会调用该方法。所以你的代码是正确的。

Apple 的 AnyCancellable 文档:

AnyCancellable 实例cancel()在取消初始化时自动调用

https://developer.apple.com/documentation/combine/anycancellable