美文网首页
Combine -- 常见的 Publisher 及 Opera

Combine -- 常见的 Publisher 及 Opera

作者: jancywen | 来源:发表于2021-02-20 16:55 被阅读0次

一、 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文档

相关文章

网友评论

      本文标题:Combine -- 常见的 Publisher 及 Opera

      本文链接:https://www.haomeiwen.com/subject/vwztfltx.html