防止NSURLSession缓存响应

时间:2015-05-19 11:30:30

标签: swift caching nsurlsession nsurlcache nsurlsessionconfiguration

为什么要缓存响应。它返回先前获取的响应。它甚至可以在关闭网络连接时工作。重置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))
}

但是,我仍然很好奇为什么我的原始代码不起作用。为所有应用程序禁用缓存以解决我的问题也感觉有点难看。

4 个答案:

答案 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

以下是显示其他选项的屏幕截图,以防有人可能需要它们:

enter image description here

答案 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