如何让CurrentValueSubject订阅时忽略初始值,仅响应后续更新?
解决方案
你可以使用Combine框架中的dropFirst()操作符来忽略订阅时的第一个(初始)值,只处理后续的状态变化。
修改后的代码示例
方式一:在Publisher定义中添加dropFirst()
private var _nwPathStatusSubject: CurrentValueSubject<NWPath.Status, Never> = .init(.satisfied) private var networkPathStatusPublisher: AnyPublisher<NWPath.Status, Never> { _nwPathStatusSubject .removeDuplicates() .dropFirst() // 忽略第一个初始值 .eraseToAnyPublisher() } networkStatusCancellable = networkPathStatusPublisher .sink {[weak self] newStatus in print(newStatus) }
方式二:在订阅时添加dropFirst()
如果你不想修改原有的Publisher定义,也可以在订阅阶段单独添加该操作符:
networkStatusCancellable = networkPathStatusPublisher .dropFirst() // 仅本次订阅忽略初始值 .sink {[weak self] newStatus in print(newStatus) }
原理说明
CurrentValueSubject的特性是订阅时立即发送当前持有的值,而dropFirst()操作符会丢弃上游Publisher发出的第一个元素,只有后续的状态变更事件会被传递到sink闭包中执行。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

