Operator之元素减少(Reducing elements)

collect

collect表达了收集的核心思想,collect一共有4种不同的用法:

  • .collect(),当没有任何参数时,它会收集publisher发送地所有数据,直到收到.finished事件。相信大家应该也意识到了,这种用法可能会造成内存方面的问题,collect会把publisher发送的数据保存在内存之中,因此,这种情况需要考虑数据量的问题。

  • .collect(3),当给其一个count参数时,它会按照指定的个数来收集数据,这就避免了内存溢出的问题。我们称这种收集数据的维度为空间维度。比如,我们上图中设置的count为3,当数据满3个的时候就会收集一次。如果在收到.finished事件之后个数不满3个,则先发送剩余的数据,然后结束pipline。

  • .collect(.byTime(q, 1.0)),试想,收集数据的维度不仅仅只有空间维度,还有时间维度,我们可以收集某个时间间隔内的数据,这就是byTime这个参数的用处

  • .collect(.byTimeOrCount(q, 1.0, 5)),如果在时间维度上再加上空间维度就更完美了

 

ignoreOutput

ignoreOutput能够忽略publisher发送的数据

["1", "2", "3"].publisher
.ignoreOutput()
.sink(receiveCompletion: { completion in
    print(".sink() received the completion", String(describing: completion))
    switch completion {
    case .finished: 
        finishReceived = true
        break
    case .failure(let anError): 
        print("received error: ", anError)
        failureReceived = true
        break
    }
}, receiveValue: { _ in 
    print(".sink() data received")
})

reduce/tryReduce

reduce按照闭包的规则把数据写到内存中,只有当publisher发送数据完毕后,才会把收集到的所有数据一次性发出去。

_ = [1, 2, 3, 4, 5, 6, 7, 8]
    .publisher
    .reduce([], { preValue, newValue -> [Int] in
        return preValue + [newValue]
    })
    .sink(receiveCompletion: { completion in
        print("结束了")
        switch completion {
        case .finished:
            print("完成")
            break
        case .failure(let error):
            print("错误:\(error.localizedDescription)")
            break
        }
    }, receiveValue: { someValue in
        print("someValue: \(someValue)")
    })

Made with in Shangrao,China By 老雷

Copyright © devler.cn 1987 - Present

赣ICP备19009883号-1