gpt4 book ai didi

Swift 结合 Set 是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 23:47:16 24 4
gpt4 key购买 nike

我以这种方式定义了带有一次性 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 View 的 onAppear 中调用 sync() 。然后我快速切换屏幕,从 SwiftUI View 引用的 ViewModel 被 ARC 释放,就像调用 deinit 一样,但订阅似乎仍然有效,一次性引用不会取消订阅,它从网络获取数据并将它们保存在核心数据中并打印同步对象:对象, 同步对象:完成。即使我停止切换屏幕几秒钟以完成旧请求,它也保持事件状态。

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

最佳答案

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

Apple 的 AnyCancellable 文档:
An AnyCancellable instance automatically calls cancel() when deinitialized
AnyCancellable

关于Swift 结合 Set<AnyCancellable> 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61889158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com