美文网首页
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