Alamofire的Session设置timeOutInterval与cachePolicy未在URLRequest生效疑问
Alamofire 5.2.2 超时与缓存配置问题解答
核心结论速览
- URLRequest 单独配置的优先级 高于 URLSessionConfiguration 全局配置
- URLSessionConfiguration 仅作为缺省值提供,不会主动覆盖已存在的 URLRequest 属性
对应问题解答
- 配置项生效优先级规则
URLRequest 本身的属性配置优先级更高,URLSessionConfiguration 仅为未单独设置属性的请求提供默认值。只要 URLRequest 已明确设置(包括初始化后的默认值),就优先使用 URLRequest 的配置。 - URLSessionConfiguration 的参数会实际生效
当请求未通过 URLRequest 单独设置 timeoutInterval、cachePolicy 等属性时,会自动使用 URLSessionConfiguration 中的配置值执行请求。 - 未覆盖 URLRequest 同名属性的原因
这是苹果原生URLSession框架的既定设计:URLSessionConfiguration是全局缺省值容器,仅负责为新生成的无配置请求提供默认参数,没有主动覆盖已存在 URLRequest 实例属性的逻辑。你测试中使用的预初始化 URLRequest 已经持有系统默认的 cachePolicy(useProtocolCachePolicy,rawValue 为 0)、timeoutInterval(60s),因此不会被 Session 的全局配置覆盖。 - 未覆盖的根本原因
和 URLRequest 拷贝行为无关,核心原因是上述的原生框架规则,Alamofire 遵循原生逻辑不会主动修改传入的 URLRequest 已有属性。如果需要请求使用 Session 的全局配置,可直接传入 URL 而非预初始化的 URLRequest,Alamofire 内部生成 URLRequest 时会自动应用 Session 配置。
如果需要统一修改所有请求的属性,也可以通过 Alamofire 的RequestInterceptor拦截请求,统一重写对应参数。
验证示例代码
let configuration = URLSessionConfiguration.af.default configuration.requestCachePolicy = .reloadIgnoringLocalCacheData configuration.timeoutIntervalForRequest = 30 let session = Session(configuration: configuration) // 直接传入URL,由Alamofire内部生成URLRequest,自动应用Session配置 session.request("https://github.com").response { response in print("### cachePolicy: \(response.request?.cachePolicy.rawValue)") // 1 print("### timeoutInterval: \(response.request?.timeoutInterval)") // 30 }
内容的提问来源于stack exchange,提问作者dirtydanee
相关产品推荐
相关产品推荐

