【发布时间】:2021-04-15 22:53:35
【问题描述】:
我正在尝试使用 combine 来管理我的套接字和处理消息
private var garbageBag = Set<AnyCancellable>()
func setupSocket() {
SocketHelper.shared.startListene()
garbageBag.forEach{$0.cancel()}
SocketHelper.shared.publisher.sink {[unowned self] (sub) in
print(sub)
print("FINISH ")
} receiveValue: {[unowned self] (value) in
print("SUBSCRBE GOT VALUE ")
}.store(in: &garbageBag)
}
这个方法调用了好几次,所以sink也被调用了很多次,防止我写的like,解决了问题
garbageBag.forEach{$0.cancel()}
但是现在假设这个方法会被调用 4 次,所以在 garbageBag 中会有 4 个项目
如何删除已取消的项目
我知道直接清空 Set 是一种解决方案,但有什么方法可以检查吗?
【问题讨论】:
-
同时对同一个发布者进行多个订阅实际上是否有效?如果没有,为什么不将
AnyCancellable存储在一个变量中,并在再次调用setupSocket时覆盖它? -
@DávidPásztor 是的,这很好! ,我的问题是
AnyCancellable是cancel()那么我怎么知道它是否被取消?有什么办法