Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

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

swift - Alamofire - NSURLCache is not working?

I set my cache as below

var cacheSizeMemory = 20 * 1024 * 1024
var cacheSizeDisk = 100 * 1024 * 1024
var sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "SOME_PATH")
NSURLCache.setSharedURLCache(sharedCache)

Create request with cache policy

var request = NSMutableURLRequest(URL: NSURL(string: "(baseUrl!)(path)")!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: timeout)

Make a request and get a response with following Cache-Control private, max-age=60

Then try to check the cache

var cachedResponse = NSURLCache.sharedURLCache().cachedResponseForRequest(urlRequest)

value is nil

Any thoughts?

See Question&Answers more detail:os

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

1 Answer

0 votes
by (71.8m points)

I was able to manually cache pages by writing them to the sharedURLCache like this:

    Alamofire.request(req)
        .response {(request, res, data, error) in
            let cachedURLResponse = NSCachedURLResponse(response: res!, data: (data as NSData), userInfo: nil, storagePolicy: .Allowed)
            NSURLCache.sharedURLCache().storeCachedResponse(cachedURLResponse, forRequest: request)
        }

NSURLCache seems to respect the headers sent by the server, even if you configure the opposite everywhere else in your code.

The Wikipedia API, for example, sends

Cache-control: private, must-revalidate, max-age=0

Which translates to: Must revalidate after 0 seconds.
So NSURLCache says: “OK, I won’t cache anything.”

But by manually saving the response to the cache, it works. At least on iOS 8.2.

Almost lost my mind on this one. :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...