Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

swift - Prevent NSURLSession from caching responses

Why does it cache responses. It returns previously fetched responses. It even works if turning off the network connection. Resetting the iOS simulator did not seem to work either. Making a request, then again with internet offline does work (cached).

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()
}

Update

I managed to solve it by calling this code from didFinishLaunching in the AppDelegate:

func removeUrlCache()
{
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))
}

However, I'm still curious why my original code does not work. It also feels a bit ugly to disable cache for all the app to solve my problem.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Thanks for the question. It put me on the right path.

There are more possibilities with NSURLCache.sharedURLCache() and you don't need to change the memory capacity and disk capacity for this.

You can remove all cached responses. Works for me.

URLCache.shared.removeAllCachedResponses()

Or you can remove the cache for a single response. Not working for me iOS 9.

let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
    URLCache.shared.removeCachedResponse(for: request)

//Do your request here

I hope it helps someone out!

Edit: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request) is not working for me unfortunately

My alternative was: I'm using this for pull to refresh and i'm tracking the last update date. So I was using the following code:

 URLCache.shared.removeCachedResponses(since: lateUpdate)

But for some reason this is not working ether.

Since iOS 8, single cache remove methods seems to be broken: https://stackoverflow.com/a/26343653/2826164

2019-05-24, updated to Swift 5.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...