You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:35:03