【发布时间】:2020-11-14 05:02:25
【问题描述】:
如下使用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 中声明:
AnyCancellable 实例在取消初始化时会自动调用 cancel()。
鉴于我们不需要在 deinit 期间释放,Combine 是否可以在 struct 中使用而不是 class?
【问题讨论】:
-
在
struct中使用Combine(我假设您的意思是订阅Combine 发布者)没有固有问题。它会取消初始化和所有。但是,如果您尝试在.sink中使用self,则会遇到问题 -
如果您要像上面的 receiveValue 那样修改 self ,那么不,您不能以这种方式将 combine 与结构一起使用。但是,如果您只是将发布者保留在 scruct 中,但在外部进行修改,则发布没有问题,等等。
-
谢谢。我假设
AnyCancellation即使在结构中仍然会自动释放,没有deinit,对吧? -
我不明白你的问题,不管类的结构如何,一旦
AnyCancellable的所有者消失了,cancellables 也会消失。引用由类或结构(甚至是闭包)持有没有区别。 -
谢谢@Cristik。我只是想知道
AnyCancellable使用什么机制来确定它可以被释放。如果它使用classdeinit,那么它在struct中不起作用。如果它使用的其他机制也适用于类和结构,那么是的,它们应该适用于两者。