在Combine 中,Publisher 是观察者模式中的Observable,并且可以通过组合变换(利用Operator)重新生成新的Publisher
主要功能是提供数据,不论是被动请求或是主动提供,有两个 Output
和 Failure
关联类型属性,Output
代表数据流中输出的值,值的更新可能是同步,也可能是异步,Failure
代表可能产生的错误,也就是说Pubslier 最核心的是定义了要发布的值与可能的错误。Publisher 通过receive(subscriber:)
接口来接受订阅,而Subscriber 订阅者的 Input
和 Failure
关联类型属性必须与 Publisher 声明的 Output
和 Failure
类型相匹配来保证类型安全
以下举一些常见的Publisher 例子:
Just
struct Just<Output>
会给每个订阅者发送一个消息,然後立即结束(这个数据流只包含一个值)
let justPubliser = Just("Hello")
Future
typealias Future<Output, Failure>.Promise = (Result<Output, Failure>) -> Void
Future
是一个专门处理异步函数的Publisher,Future
初始化需要提供执行具体操作的closure,这个操作可以是异步的,并且最终返回一个Result
,所以Future
只有两种结果:
在将一些异步操作转换为Publisher 时非常有用,像是网络请求等等
let futurePubliser = Future<Int, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
promise(.success(1))
}
}
Deferred
Deferred
初始化需要提供一个生成Publisher 的closure,只有在有Subscriber 订阅的时候才会生成指定的Publisher,也就是当收到订阅後才建立Publisher
let deferredPublisher = Deferred {
return Future<Bool, Error> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
return promise(.success(true))
}
}
}
Future
不管有没有订阅者都会立刻执行,而Deferred
只有当收到订阅後才会初始化
<<: Day15 开发套件 - 实作MethodChannel
新增工作表 使用create_sheet()方法新增工作表,title参数为工作表名称 wb = l...
回到家以後,沉睡又再沉睡的时间大量发生。 平常没有休息的部分,直接从所有内里涌现出来。 即使是平常很...
大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...
Photo by Victoriano Izquierdo on Unsplash 文章同步发布於...
在上一篇文章中提到,我们可以将不同类别当中的共同属性或方法,提取出来放在 parent 类别当中,然...