【发布时间】:2018-12-05 02:52:37
【问题描述】:
刚刚发现函数 storeCachedResponse(_ cachedResponse: CachedURLResponse, for request: URLRequest) 是异步工作的。即执行后不会立即返回结果。我在官方文档中没有找到对此的描述。 见例子:
cache = URLCache(memoryCapacity: 0, diskCapacity: 100 * 1024 * 1024, diskPath: "myCache")
let config = URLSessionConfiguration.default
config.requestCachePolicy = .returnCacheDataElseLoad
config.urlCache = cache
let session = URLSession(configuration: config)
session.dataTask(with: request, completionHandler: {[unowned self]
(data, response, error) in
if let data = data, let response = response, ((response as HTTPURLResponse)?.statusCode ?? 500) < 300 {
let cachedData = CachedURLResponse(response: response, data: data)
self.cache.storeCachedResponse(cachedData, for: request)
let testCachedData = self.cache.cachedResponse(for: request)
}
}
理论上 testCachedData 必须包含缓存的响应。但它实际包含的内容:
testCachedData?.response.url // Ok
testCachedData?.isEmpty // false
testCachedData?.data // 0 bytes!!!
虽然 testCachedData?.data 说它包含 0 个字节,但我们可以将这个数据写入一个文件,这个文件将包含真实数据,而不是 0。如果我们深入到本地缓存目录(~/Library/Caches/myApp/ MyCache)在 cachedResponse 调用后立即在断点处暂停时,我们可以看到带有缓存文件(fsCachedData)的文件夹还不存在。 现在让我们在 storeCachedResponse 和 cachedResponse 之间插入延迟:
cache = URLCache(memoryCapacity: 0, diskCapacity: 100 * 1024 * 1024, diskPath: "myCache")
let config = URLSessionConfiguration.default
config.requestCachePolicy = .returnCacheDataElseLoad
config.urlCache = cache
let session = URLSession(configuration: config)
session.dataTask(with: request, completionHandler: {[unowned self]
(data, response, error) in
if let data = data, let response = response, ((response as HTTPURLResponse)?.statusCode ?? 500) < 300 {
let cachedData = CachedURLResponse(response: response, data: data)
self.cache.storeCachedResponse(cachedData, for: request)
delay(5) // JUST 5 SEC DELAY
let testCachedData = self.cache.cachedResponse(for: request)
}
}
现在:
testCachedData?.response.url // Ok
testCachedData?.isEmpty // false
testCachedData?.data // contains bytes
因此,延迟 5 秒后,我们看到缓存文件夹 (fsCachedData) 存在并包含缓存文件(例如 D8A30D21-C8F1-4FCA-967E-F6B440998173)。
重点是如何捕捉storeCachedResponse的完成?
我将在创建缓存文件后立即使用它们。而且我要直接处理缓存文件,设置延迟不是最好的办法。
【问题讨论】:
-
在上一行设置后没有意义?您已经在该函数中有响应,只需使用响应并在此函数之外使用任何您想使用的地方,然后从缓存中读取。
-
你能更精确一点吗?你指的是哪个功能?函数还是闭包?
-
self.cache.storeCachedResponse(cachedData, for: request) delay(5) // 延迟 5 秒 let testCachedData = self.cache.cachedResponse(for: request)
-
本主题的主题是响应的实例出现在数据实际缓存到文件之前。并且没有办法在它出现后立即使用响应。
标签: ios swift nsurlcache