gpt4 book ai didi

swift - 可以在结构(而不​​是类)中使用组合吗?

转载 作者:行者123 更新时间:2023-12-05 00:55:17 25 4
gpt4 key购买 nike

使用 Combine 时如下

var cancellables: [AnyCancellable] = []

func loadItems(tuple : (name : String, imageURL : URL)) {
URLSession.shared.dataTaskPublisher(for: tuple.imageURL)
.sink(
receiveCompletion: {
completion in
switch completion {
case .finished:
break
case .failure( _):
return
}},
receiveValue: { data, _ in DispatchQueue.main.async { [weak self] in self?.displayFlag(data: data, title: tuple.name) } })
.store(in: &cancellables)
}

我们不需要在如下的deinit中调用cancel

deinit {
cancellables.forEach {
$0.cancel()
}
}

鉴于 https://developer.apple.com/documentation/combine/anycancellable ,据说:

An AnyCancellable instance automatically calls cancel() when deinitialized.

鉴于我们不需要在 deinit 期间释放,是否可以在 struct 中使用 Combine 而不是 class

最佳答案

为了直接回答您的问题,AnyCancellable 不依赖于存储在类中来取消自身。像任何引用计数的对象一样,它可以很好地存储在结构中,并且在没有更多引用时会正确地取消初始化并因此取消。

也就是说,你在这里怀疑是正确的。您可能希望像在此处那样将 AnyCancellable 存储在结构中。对于初学者,你必须将你的 loadItems 函数标记为 mutating 才能让它编译,因为存储 AnyCancellable 意味着改变 cancellables 数组。

通常,如果您要存储一个 AnyCancellable,那么您就是将该操作与具有真实身份的事物相关联,因此可以更好地表示为一个类。您基本上是在说“当此实例消失时取消此操作”。例如,如果您正在下载要在 UIViewController 中显示的图像,您可能希望在 UIViewController 因为用户关闭它而消失时取消该下载;也就是说,下载操作与UIViewController特定实例相关联。

由于结构具有值语义,因此将 AnyCancellable 与结构的“实例”相关联在概念上几乎是不连贯的。结构没有实例,它们只有值。当您将结构作为参数传递给函数时,它会创建一个副本。这意味着如果函数调用 loadItems 则只有函数自己的结构值副本将存储 AnyCancellable,并且当函数返回时操作将立即取消,因为您原来的该值的副本未存储 AnyCancellable

关于swift - 可以在结构(而不​​是类)中使用组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64831092/

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