Dropping values 主要用途是将特定的值丢掉,丢掉的条件有以下三种用法。
dropFirst
dropFirst 里面可以带一个 interger的参数,来决定 publisher 发出来的元素从地一个开始数地几个。
publisher .dropFirst(2) .sink(receiveValue: { print($0) }) .store(in: &subscriptions)
interger可以不带参数,那么就是预设的只drop 第一个元素。
publisher .dropFirst() .sink(receiveValue: { print($0) }) .store(in: &subscriptions)
关于 dropFirst 事实上在 Sequence 里面有一个类似的方法,而概念是一样的,也就是 drop 指定数量的元素。可以看这个延伸阅读。
drop(while:)
里面带一个 closure,这个 closure 返回一个 Bool,当这个 Bool 为true 之前,前面的元素通通drop。反之则保留。
publisher .drop(while: { return $0 % 5 != 0 }) .sink(receiveValue: { print($0) }) .store(in: &subscriptions)
可以注意的是,你可能会认为这个跟 filter 很像。但是他们其实是完全不一样的东西。
这个方法比较特殊,drop 的条件不是判断当前 publisher抛出的元素,而是判断另外一个 publisher的讯号。drop 只要通过了closure的验证,后面就会全部通过。 而 filter 不一样,每一个元素都需要通过closure的验证。
drop(untilOutputFrom:)
let upstream = PassthroughSubject<Int,Never>()let second = PassthroughSubject<String,Never>()cancellable = upstream .drop(untilOutputFrom: second) .sink { print("\($0)", terminator: " ") }upstream.send(1)upstream.send(2)second.send("A")upstream.send(3)upstream.send(4)