如何让组合订阅者在收到特定值时完成

  • 本文关键字:组合 swift combine
  • 更新时间 :
  • 英文 :


我试图使用Combine订阅者来等待来自发布者的特定值,如果我处理sink(receiveValue:)中的值,这似乎很容易,但是我想将发布者转换为另一个发布者,当收到特定值时才完成。

下面是有效的代码:

let publisher: AnyPublisher<Int, Never> = ...
let cancellable = publisher.sink(receiveValue: { value in
if value == myFavoriteNumber {
// we're finished!
}
})

我想完成的事情是这样的:

let modifiedPublisher: AnyPublisher<Never, Never> = publisher.compactMap({ 
$0 == myFavoriteNumber ? Publishers.Completion.finished : nil 
}).eraseToAnyPublisher()

有办法做到这一点吗?

我提出的解决方案使用tryPrefix运算符:

let FavoriteNumber = 42
let publisher: AnyPublisher<Int, Never> = (0...360).publisher.eraseToAnyPublisher()
let upToFavoriteNum = publisher.tryPrefix {
$0 != FavoriteNumber
}
let subscription = upToFavoriteNum.sink(receiveCompletion: {
completion in
debugPrint(completion)
}, receiveValue: {
print("processing ($0)")
})

最新更新