将订阅存储到订阅集中的原因是什么?

Lor*_*lor 8 swift combine

组合订阅示例代码片段全部将生成的订阅存储到集合subscriptions

private var subscriptions = Set<AnyCancellable>()
Run Code Online (Sandbox Code Playgroud)

为什么我们需要这样做?

future
  .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) }) 
  .store(in: &subscriptions)
Run Code Online (Sandbox Code Playgroud)

rob*_*off 10

我们通常希望将订阅存储在某个地方,以使订阅保持活动状态。我们经常希望保持多个订阅处于活动状态,直到封闭的对象被销毁,因此将所有订阅存储在单个容器中很方便。

然而,容器不一定Set!它可以是(通常应该是)一个Array.

Cancellable提供了两种 store(in:)方法:

extension Cancellable {
    public func store<C>(in collection: inout C) where C : RangeReplaceableCollection, C.Element == AnyCancellable

    public func store(in set: inout Set<AnyCancellable>)
}
Run Code Online (Sandbox Code Playgroud)

Array符合RangeReplaceableCollection,但Set不符合 ,所以它需要自己的方法。)

您已经找到了存储到Set. 但是你需要a 的行为吗Set?将订阅存储在 a 中的唯一原因Set是,如果您需要有效地从集合中删除单个订阅,并且集合可能很大。否则,只需使用Array,如下所示:

class MyObject {

    private var tickets = [AnyCancellable]()

    ...
        future
            .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) }) 
            .store(in: &tickets)
Run Code Online (Sandbox Code Playgroud)

我认为您经常看到使用 a 的代码的原因Set<AnyCancellable>是大多数 Swift 程序员对SetArray比对更熟悉RangeReplaceableCollection。当 Xcode 提供自动完成功能store以获取 aSet或 a时,如果您不知道 an是 a RangeReplaceableCollection,您将选择该版本。SetArrayRangeReplaceableCollection