组合订阅示例代码片段全部将生成的订阅存储到集合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 程序员对Set和Array比对更熟悉RangeReplaceableCollection。当 Xcode 提供自动完成功能store以获取 aSet或 a时,如果您不知道 an是 a RangeReplaceableCollection,您将选择该版本。SetArrayRangeReplaceableCollection
| 归档时间: |
|
| 查看次数: |
1931 次 |
| 最近记录: |