Publiser
简介
Combine 的核心是发布者协议。该协议定义了一种类型的要求,以便能够随时间向一个或多个订阅者传输一系列值。换句话说,你可以将感兴趣的值,用发布者将其用事件的方式发布出去。
发布者可以发出零个或多个值,但只能发出一个完成事件,可以是正常的完成事件,也可以是错误。一旦发布者发出完成事件,它就完成了,不能再发出任何事件。
在实际应用中,我们用Publishers来启动我们Combine流程,也可以称为Combine链,试想下你如果想观察一个数据的变化,那么我们要把数据放到Combine流程中,然后我们可以用订阅的方式来异步的接收他的变化值。这些的关键起始点,就是要把数据,用Publishers发布出去。
比如我们可以用PassthroughSubject和CurrentValueSubject发布数据,同时发布错误;
可以用Just发布一个错误类型默认为Never的数据,等等。
所以,实际应用中使用Combine的核心思想之一,就是将数据当成Publishers的Output,开始Combine流程。
代码说明
我们在playground中观察如下代码:
// 1
var cancellable = Set<AnyCancellable>()
// 2
let myPublisher = PassthroughSubject<Int, Never>()
// 3
myPublisher
.sink(receiveCompletion: { completion in
// 4
switch(completion) {
case .finished:
print("finished")
case .failure(let error):
print(error.localizedDescription)
}
}, receiveValue: { value in
// 5
print(value)
})
.store(in: &cancellable)
// 6
myPublisher.send(2)
// 7
myPublisher.send(completion: .finished)
// 8
myPublisher.send(3)
1、声明AnyCancellable的集合,用于管理Combine的内存
2、声明一个Publisher,我们用PassthroughSubject来返回一个Publisher,如果您没有使用过,也不要害怕,后面我们会详细说明这个Publisher,同时他也是我们会经常用到的一个生成Publisher的函数。
他生成了一个Output值为Int型,错误类型为Never,也就是永远不会出现错误。
3、开始Combine的订阅流程,用sink来实现订阅,也就是第一章提到的`Subscriptions`
4、处理订阅的状态,分为完成状态(.finished)和错误状态(.failure(error))
5、处理数据接收,在这里我们将数据打印
6、开始发布数据,首先发布了一个整型数据(2)
7、发布结束状态,表示订阅完成
8、再次发布一个数据,