我试图更好地理解组合框架。当然,.sink()
将发布者连接到订阅者。在Xcode Playground页面中,谁是订阅者?考虑下面的例子:
PlaygroundPage.current.needsInfiniteExecution = true
var subscriptions: Set<AnyCancellable> = []
Timer.TimerPublisher(every: 1, on: .main, in: .common)
.autoconnect()
.sink { print($0) } // Who is this sink connecting the timer publisher to?
.store(in: &subscriptions)
我知道发布-订阅链接正在发生,因为发布者确实开始发布了。只是不清楚订阅者是谁。是否有一种方法可以确定地查询订阅者是谁?
同样,如果这个计时器发布者的订阅者是playgroundPage的当前实例,那么为什么我必须使用store(in:)
来存储订阅?这难道不是不必要的吗?因为订阅者不会很快离开范围(直到我停止游乐场)?
你的理解是错误的。.sink
是一个订阅者——实际上,它创建了一个Sink对象,这是一个订阅者——在本例中,它是订阅者。
一个附加的细微之处是,操作符(如.autoconnect()
)既是订阅者又是发布者。但是在这个管道的末端只有一个真正的订阅者,它就是Sink。
Sink没有"连接定时器发布器"。任何事情。它本身就是正在打印的对象。
.store
命令将Sink(封装为AnyCancellable)分配到subscriptions
集合中。注意,这是一个不好的名字:在Combine中,订阅与订阅者是非常非常不同的东西。