23

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

4 回答 4

19

谢谢你的问题。它让我走上了正确的道路。

有更多的可能性,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。

于 2016-01-15T09:47:15.010 回答
12

不确定这是否真的可以防止 chaching 或者只是每次都强制重新加载,但这对我有用:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

这是一个屏幕截图,显示了其他选项,以防有人需要它们:

在此处输入图像描述

于 2016-07-21T05:48:53.197 回答
1

我将实现 URLSessionDelegate 并在 willCache 委托实现中使用 nil 调用 completionBlock。这是您的请求将永远不会受到影响

于 2018-11-26T11:25:10.397 回答
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;

这在后台会话中默认为 nil,因此默认情况下禁用缓存。

参考: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

请注意,此委托方法仅在上传和数据任务时调用,不会为具有后台或临时配置的会话调用。

参考:https ://developer.apple.com/documentation/foundation/url_loading_system/accessing_cached_data

于 2020-03-20T14:59:09.780 回答