网络请求中DataTask未执行问题排查:基于URLSession与AnyPublisher的RestManager实现异常
排查URLSession DataTask未执行的问题
从你的代码来看,最核心的问题是你创建了URLSession dataTask但没有调用resume()方法——这是网络任务启动的必要步骤,没调用的话任务根本不会被系统调度执行,自然不会进入你设置断点的分支逻辑,Future也永远不会发送任何结果,导致ViewModel只能拿到默认的空数组,也不会有错误抛出。
修复核心问题
只需要在创建dataTask的代码末尾加上.resume(),让任务启动:
class RestManager { func fetchData<T: Decodable>(url: URL) -> AnyPublisher<Result<T, ErrorType>, Never> { return Future<Result<T, ErrorType>, Never> { promise in URLSession .shared .dataTask(with: url) { data, response, error in // 你的原有逻辑... } .resume() // 这里加上resume()! } .eraseToAnyPublisher() } }
额外排查点(如果修复后仍有问题)
如果加上resume()后还是没进入分支,你可以检查以下几点:
- URL有效性:确认传入的
url是合法可访问的,比如在浏览器里打开这个URL看看是否能正常返回数据 - 网络权限/ATS设置:如果是iOS平台,若使用HTTP协议(非HTTPS),需要在
Info.plist中配置NSAppTransportSecurity的例外规则,否则系统会拦截请求 - Combine订阅生命周期:在ViewModel中订阅这个Publisher时,要确保订阅对象(
AnyCancellable)被正确持有,没有被提前释放——如果订阅被销毁,即使网络任务执行了,你也接收不到结果
内容的提问来源于stack exchange,提问作者Marko Markovic
相关产品推荐
相关产品推荐

