Combine:取消一个 Set<AnyCancellable> 或删除它所有存储的对象以停止订阅
Combine: Cancel a Set<AnyCancellable> or remove all its stored objects to stop the subscriptions
如果我有一组 AnyCancellable:
var observations: Set<AnyCancellable> = []
从集合中删除所有对象有什么区别:
observations.removeAll()
或取消每个订阅:
observations.forEach { [=13=].cancel() }
它们的效果一样吗?或者如果调用 .removeAll()
时任何订阅中有强引用,强引用将不会被消除?
如果它们具有相同的效果,我想使用第一种方法是一个很好的做法,因为您不需要遍历所有 Set。
如果强烈引用集合中的任何可取消项,则意味着其他方对它们感兴趣,因此不应不明确取消它们。
通过删除引用,您表示 observations
的所有者不再对这些可取消项感兴趣。如果那是唯一拥有的引用,则取消将自动发生。
如果您显式地取消了每个可取消项并且错误地拥有其他强引用,那么您可能会掩盖这些错误的影响,从而使它们更难找到。如果您故意有其他强引用,您将取消您不期望的事情。所以只需清空集合即可。
如果我有一组 AnyCancellable:
var observations: Set<AnyCancellable> = []
从集合中删除所有对象有什么区别:
observations.removeAll()
或取消每个订阅:
observations.forEach { [=13=].cancel() }
它们的效果一样吗?或者如果调用 .removeAll()
时任何订阅中有强引用,强引用将不会被消除?
如果它们具有相同的效果,我想使用第一种方法是一个很好的做法,因为您不需要遍历所有 Set。
如果强烈引用集合中的任何可取消项,则意味着其他方对它们感兴趣,因此不应不明确取消它们。
通过删除引用,您表示 observations
的所有者不再对这些可取消项感兴趣。如果那是唯一拥有的引用,则取消将自动发生。
如果您显式地取消了每个可取消项并且错误地拥有其他强引用,那么您可能会掩盖这些错误的影响,从而使它们更难找到。如果您故意有其他强引用,您将取消您不期望的事情。所以只需清空集合即可。