Swift Combine中的空订阅者:是否有更便捷的实现方案?
解决方案
当然有更便捷的方案,你可以通过两种方式实现「无需处理结果的Publisher订阅」:
1. 自定义空实现的Subscriber类
直接实现Subscriber协议,所有方法做空处理,专门用来忽略所有事件:
import Combine class EmptySubscriber<Input, Failure: Error>: Subscriber { func receive(subscription: Subscription) { // 请求所有数据,确保Publisher能正常完成 subscription.request(.unlimited) } func receive(_ input: Input) -> Subscribers.Demand { // 忽略输入值 return .none } func receive(completion: Subscribers.Completion<Failure>) { // 忽略完成/失败事件 } }
使用时直接订阅这个Subscriber即可,记得要存储订阅对象避免被提前释放:
var cancellables = Set<AnyCancellable>() someFunc() .subscribe(EmptySubscriber()) .store(in: &cancellables)
2. 扩展Publisher添加便捷方法
如果不想每次都手动创建Subscriber,可以给Publisher扩展一个专用方法,内部封装空的sink逻辑:
import Combine extension Publisher { /// 订阅Publisher但忽略所有事件(适用于只需要触发执行、无需处理结果的场景) func fireAndForget() -> AnyCancellable { sink( receiveCompletion: { _ in }, receiveValue: { _ in } ) } } // 针对Failure为Never的场景,可以简化成更短的版本 extension Publisher where Failure == Never { func fireAndForget() -> AnyCancellable { sink(receiveValue: { _ in }) } }
调用时只需一行代码:
var cancellables = Set<AnyCancellable>() someFunc().fireAndForget().store(in: &cancellables)
适用场景说明
这类方案完美匹配你提到的「预加载远程资源并缓存」场景:只要触发Publisher执行(比如发起网络请求、写入缓存),无需关心返回结果或完成状态,订阅逻辑会确保Publisher正常走完整个流程。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

