作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我已将可取消集存储到 ViewController 中:
private var bag = Set<AnyCancellable>()
其中包含多个订阅。
bag.removeAll() is enough?
还是我应该遍历集合并一一取消所有订阅?
for sub in bag {
sub.cancel()
}
Apple 表示订阅一直有效,直到存储的 AnyCancellable 在内存中。所以我想用
bag.removeAll()
解除分配可取消的应该够了吧?
最佳答案
上 deinit
您的 ViewController 将从内存中删除。它的所有实例变量都将被释放。Combine > Publisher > assign(to:on:)
的文档说:
An AnyCancellable instance. Call cancel() on this instance when you no longer want the publisher to automatically assign the property. Deinitializing this instance will also cancel automatic assignment.
bag
也将被解除分配。由于没有更多引用您的
AnyCancellable
的,任务将结束。
viewWillAppear
/
viewDidDissapear
, 例如。在这种情况下,您的 ViewController 仍在内存中。
viewDidDissappear
,你可以做
bag.removeAll()
正如你所怀疑的。这将删除引用并停止分配。
.removeAll()
在行动:
var bag = Set<AnyCancellable>()
func testRemoveAll() {
Timer.publish(every: 1, on: .main, in: .common).autoconnect()
.sink { print("===== timer: \($0)") }
.store(in: &bag)
Timer.publish(every: 10, on: .main, in: .common).autoconnect()
.sink { _ in self.bag.removeAll() }
.store(in: &bag)
}
bag.removeAll()
.然后两个计时器发布者都将停止。
关于iOS Swift 组合 : cancel a Set<AnyCancellable>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59002502/
我是一名优秀的程序员,十分优秀!