一、 Publisher
1、Empty
Empty 是一个最简单的发布者,它只在被订阅的时候发布一个完成事件 (receive
finished)。这个 publisher 不会输出任何的 output 值,只能用于表示某个事件已经发生。
2、Just
表示一个单一的值,在被订阅后,这个值会被发送出去,紧接着是 finished
3、序列 Publisher
Publishers.Sequence 接受一个 Sequence:它可以是一个数组,也可以是一个 Range。在被订阅时,Sequence 中的元素被逐个发送出来
Publishers.Sequence<[Int], Never>(sequence: [1, 2, 3])
为了方便使用,Sequence 提供了一个辅助属性来从一个序列中获取Publisher。上面的代码可以等效写为:
[1, 2, 3].publisher
二、 Operator
1、map
[2, 9, 0]
.publisher
.map {
$0 * 8
}
// 16, 72, 0
Array 存储的是当前存在的一组元素,对它们进行 map 将同步地把这些元素进行变形。而Publisher “存储的” 是未来的一组元素,map 操作则是异步地在未来 output 事件发生时再进行变形。
2、compactMap
它的作用是将 map 结果中那些 nil 的元素去除掉,这个操作通常会 “压缩” 结果,让其中的元素数减少
["1", "2", "3", "cat", "5"]
.publisher
.compactMap {
Int($0)
}
// 1, 2, 3 ,5
3、flatMap
flatMap 将会涉及两个 Publisher:一个是 flatMap 操作本身所作用的外层 Publisher,一个是 flatMap 所接受的变形闭包中返回的内层 Publisher。flatMap 将外层 Publisher 发出的事件中的值传递给内层 Publisher,然后汇总内层 Publisher 给出的事件输出,作为最终变形后的结果。flatMap 的目的是将多个异步操作展平为单个事件流,其目的就是 降维
["A", "B", "C"]
.publisher
.flatMap { letter in
[1, 2, 3].publisher.map{"\(letter)\($0)"}
}
.print()
.sink(
receiveCompletion: {_ in},
receiveValue: {_ in}
)
// receive subscription: (FlatMap)
// request unlimited
// receive value: (A1)
// receive value: (A2)
// receive value: (A3)
// receive value: (B1)
// receive value: (B2)
// receive value: (B3)
// receive value: (C1)
// receive value: (C2)
// receive value: (C3)
// receive finished
[[1, 2, 3], [4, 5, 6]]
.publisher
.flatMap {
$0.publisher
}
.print()
.sink(
receiveCompletion: {_ in},
receiveValue: {_ in}
)
// receive subscription: (FlatMap)
// request unlimited
// receive value: (1)
// receive value: (2)
// receive value: (3)
// receive value: (4)
// receive value: (5)
// receive value: (6)
// receive finished
4、 scan
累加
scan 一个最常见的使用场景是在某个下载任务执行期间,接受 URLSession 的数据回调,将接收到的数据量做累加来提供一个下载进度条的界面。
[1, 2, 3]
.publisher
.scan(0, +)
// 6
5、removeDuplicates
移除连续出现的重复事件值
[1, 2, 2, 3, 4, 4, 4, 5]
.publisher
.removeDuplicates
// 1,2,3,4,5
参考:Publisher文档
网友评论