Swift问题:调用removeCachedResponses(since:)无法按日期清除URLCache缓存?
解决URLCache的
removeCachedResponses(since:)无法清除缓存的问题 核心原因是:这个方法的生效完全依赖缓存响应中包含有效的日期信息,具体解决思路如下:
为什么其他清除方法能生效?
removeAllCachedResponses()是全量清除逻辑,不管缓存有没有日期都会执行;removeCachedResponse(for:)是根据请求匹配缓存,和日期属性无关。但removeCachedResponses(since:)是通过对比缓存响应的日期与你传入的日期来判断是否清除,若缓存里没有设置日期,系统会默认判定该缓存“晚于你传入的日期”,直接跳过不清除。手动存储缓存时必须设置响应日期
你是通过storeCachedResponse(_:for:)手动存储缓存,必须确保传入的CachedURLResponse对应的HTTPURLResponse的date属性是有效Date值:- 如果是从网络请求拿到的原始响应,直接复用它的
date即可,不要手动覆盖或忽略; - 如果是手动构造缓存,必须给
HTTPURLResponse设置符合HTTP规范的日期头,示例代码:// 构造符合HTTP标准的日期格式化器 extension DateFormatter { static let httpStandard: DateFormatter = { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z" return formatter }() } // 构造带日期的HTTP响应 guard let url = request.url else { return } let headerFields = ["Date": DateFormatter.httpStandard.string(from: Date())] let httpResponse = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: headerFields)! // 构造缓存响应并存储 let cachedResponse = CachedURLResponse(response: httpResponse, data: yourResponseData) URLCache.shared.storeCachedResponse(cachedResponse, for: request)
- 如果是从网络请求拿到的原始响应,直接复用它的
日期格式无需额外处理
调用removeCachedResponses(since:)时,直接传入Date类型的值即可,系统会自动完成与缓存响应日期的对比,不需要你手动转换为特定字符串格式。快速排查小技巧
可以先检查你存储的缓存响应的response.date是否为nil,如果是,那就是未设置日期导致无法被该方法清除。
内容的提问来源于stack exchange,提问作者rotecodefraktion
相关产品推荐
相关产品推荐

