9

我将缓存设置如下

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

使用缓存策略创建请求

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

提出请求并获得以下回复Cache-Control private, max-age=60

然后尝试检查缓存

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

值为零

有什么想法吗?

4

6 回答 6

19

我可以通过将页面写入 sharedURLCache 来手动缓存页面,如下所示:

    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 似乎尊重服务器发送的标头,即使您在代码中的其他任何地方都配置了相反的标头。

例如,Wikipedia API 发送

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

这意味着:必须在 0 秒后重新验证。
所以 NSURLCache 说:“好吧,我不会缓存任何东西。”</p>

但是通过手动将响应保存到缓存中,它可以工作。至少在 iOS 8.2 上。

差点把这件事弄丢了。:)

于 2015-04-01T16:54:38.407 回答
9

我最终在我的请求标题中手动添加Cache-Control,现在它可以工作了。private甚至不需要手动检查缓存,Alamofire 帮你搞定

let cachePolicy: NSURLRequestCachePolicy = isReachable() ? .ReloadIgnoringLocalCacheData : .ReturnCacheDataElseLoad

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

request.addValue("private", forHTTPHeaderField: "Cache-Control")

var alamoRequest = Manager.sharedInstance.request(urlRequest)
于 2015-01-06T00:05:57.993 回答
3

我发现 URLCache 不能保存大于 5% (1/20) 容量的响应。

默认缓存的 memoryCapacity = 512000,它不会保存到大于 25600 的内存响应。

作为解决方案扩展容量

于 2018-03-27T11:16:15.770 回答
2

【解决NSURLcache过期的Swift解决方案】

我认为这里的主要问题是:ReturnCacheDataElseLoad.

@arayax 给了你可能会解决这个问题的答案,但我的解决方案是这样的:

由于我将 Alamofire 用于网络请求,因此我设置了配置:

  configuration.requestCachePolicy = .ReturnCacheDataElseLoad

当我发出请求时,我会检查互联网连接,如果它是真的,则清除 NSURLCache,因此它将强制 Alamofire 在服务器上而不是从缓存中发出请求:

    if Reachability.isConnectedToNetwork() == true {
        ConfigService.cache.removeAllCachedResponses()
    }

    ConfigService.manager?.request(.GET, ...

我希望这会有所帮助,也许对于 NSURLCache 的其他类型的问题 :)

于 2016-03-28T05:43:54.040 回答
1

对我来说,删除它之后是Pragma →no-cache一切正常。

于 2017-01-17T04:20:15.250 回答
0

这就是我如何让缓存与 Alamofire 4 和 swift 3 一起使用(半完整功能供参考):

 func getTheList(courseId : String )->  Void{
        appConstants.sharedInstance.startLoading()
        let TheURL = DEFAULT_APP_URL + "api/getMyList?Id="+ID
        let urlString = NSURL(string: TheURL)
        var mutableURLRequest = URLRequest(url: urlString! as URL)
        mutableURLRequest.httpMethod = "GET"
        mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
        mutableURLRequest.cachePolicy = NSURLRequest.CachePolicy.returnCacheDataElseLoad


        Alamofire.request(mutableURLRequest)
            .responseJSON
           {.......
于 2017-05-08T14:00:42.590 回答