为什么要缓存响应。它返回先前获取的响应。它甚至可以在关闭网络连接时工作。重置iOS模拟器似乎也不起作用。发出请求,然后再次通过互联网离线确实有效(缓存)。
public let urlSession: NSURLSession
public init()
{
// ...
var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
urlSession = NSURLSession(configuration: configuration)
}
func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback)
{
let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path
let url = NSURL(string: urlString)
let request = oauthInstance.request(forURL: url!)
request.HTTPMethod = httpMethod
self.customOAuth2Manager.setupRequest(request)
for (key, value) in headers {
request.setValue(value, forHTTPHeaderField:key)
}
if let body = body where body != "" {
let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = postData
}
let task = urlSession.dataTaskWithRequest(request) { data, response, error in
self.parseData(data, response:response, error:error, body:body, callback: callback)
}
task.resume()
}
更新
我设法通过didFinishLaunching
中的AppDelegate
调用此代码来解决此问题:
func removeUrlCache()
{
NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))
}
但是,我仍然很好奇为什么我的原始代码不起作用。为所有应用程序禁用缓存以解决我的问题也感觉有点难看。
答案 0 :(得分:18)
感谢您的提问。它让我走上了正确的道路。
NSURLCache.sharedURLCache()
有更多可能性,您无需为此更改内存容量和磁盘容量。
您可以删除所有缓存的响应。 适合我。
URLCache.shared.removeAllCachedResponses()
或者您可以删除单个响应的缓存。 不适用于iOS 9。
let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
URLCache.shared.removeCachedResponse(for: request)
//Do your request here
我希望它可以帮助别人!
修改强>
不幸的是NSURLCache.sharedURLCache().removeCachedResponseForRequest(request)
对我不起作用
我的替代方案是:我正在使用它进行刷新,我正在跟踪上次更新日期。所以我使用以下代码:
URLCache.shared.removeCachedResponses(since: lateUpdate)
但由于某些原因,这不是以太工作。
自iOS 8以来,单缓存删除方法似乎被打破:https://stackoverflow.com/a/26343653/2826164
2019-05-24,更新为Swift 5。
答案 1 :(得分:10)
不确定这是否实际上阻止了追逐,或者每次只是强制重新加载,但这对我有用:
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
以下是显示其他选项的屏幕截图,以防有人可能需要它们:
答案 2 :(得分:0)
我将实现URLSessionDelegate,并在willCache委托实现中以nil调用completeBlock。这是您的请求,永远不会被取消
答案 3 :(得分:0)
选项1 设置sessionConfig.URLCache = nil将禁用缓存。
/* The URL resource cache, or nil to indicate that no caching is to be performed */
@property (nullable, retain) NSURLCache *URLCache;
在后台会话中默认为零,因此默认情况下禁用缓存。
参考:https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410148-urlcache
选项2
实现以下委托方法并调用completionHandler(nil)将防止缓存。
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
willCacheResponse:(NSCachedURLResponse *)proposedResponse
completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler
请注意,仅针对上传和数据任务调用此委托方法,而对于具有后台或临时配置的会话则不会调用。
Ref:https://developer.apple.com/documentation/foundation/url_loading_system/accessing_cached_data