即使将缓存策略设置为ReloadIgnoringLocalAndRemoteCacheData ,Alamofire仍从缓存加载。

17

我在 Alamofire 中将缓存策略设置为请求时忽略本地缓存。

然后我加载了一个带有网络连接的视图控制器,然后断开了网络连接,关闭了应用程序并再次运行。

现在不会显示没有网络可用的错误(即 Alamofire 不会创建 nserror 对象),而是以似乎成功从缓存获取数据的方式运行应用程序。奇怪的是,当我尝试使用

NSURLCache.sharedURLCache().cachedResponseForRequest(request)

即使数据来自缓存,也会返回nil。

我能够防止返回缓存响应的唯一方法是执行NSURLCache.sharedURLCache().removeAllCachedResponses()

    let request = NSURLRequest(URL: NSURL(string: url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 100)

    Alamofire.manager.request(method, request, parameters:params)
    .responseJSON { (request, response, data, error) in
        if let anError = error {
            if anError.code == NSURLErrorNotConnectedToInternet {
                UIAlertView(title: "Alert", message: "No Network Connection Available", delegate: nil, cancelButtonTitle: "ok").show()
            }    

        } else if let data: AnyObject = data {
            println(NSURLCache.sharedURLCache().cachedResponseForRequest(request))
 //prints nil

    }

} 
}
我想做的是仅在没有网络连接时从缓存中加载数据,类似于有限的离线模式。如何实现?
3个回答

13

我在项目中使用这种方法,它很有效:

let mutableURLRequest = NSMutableURLRequest(URL: SERVICEURL)
mutableURLRequest.HTTPMethod = "POST"

mutableURLRequest.HTTPBody = self.createJson()
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
mutableURLRequest.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

request(mutableURLRequest).validate().responseJSON{ response in...

希望能对您有所帮助。


@HongZhou 这是Alamofire的一个便捷方法。您可以使用它作为Alamofire.request(mutableURLRequest).validate().responseJSON{ response in...} - Fábio Salata
@FábioSalata。你能指导一下如何在Swift3中缓存数据吗?我正在使用Alamofire。 - Uma Madhavi
@FábioSalata,你能帮我解决一个问题吗?我想知道如何使用Alamofire在Swift中缓存数据,并在服务调用之前从缓存数据中获取特定时间限制内的数据。 - Nikunj Kumbhani

8

感谢@FábioSalata的帮助,我按照下面的方法解决了我的问题。

 var req = URLRequest(url: URL(string: "<URL>")!)
 req.httpMethod = "GET"
 req.setValue("application/json", forHTTPHeaderField: "Content-Type")
 req.setValue("<Auth KEY>", forHTTPHeaderField:"Authorization" )
 req.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

 Alamofire.request(req).validate().responseJSON { response in ...

1
这段代码是与类ClassName一起工作的,它继承了UIViewController和NSURLConnectionDelegate。 - Emin Turk

5

现在已经可以在https://developer.apple.com/documentation/ios_ipados_release_notes/ios_13_release_notes#see-also中找到关于NSURLRequest.CachePolicy.reloadRevalidatingCacheData和NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData的信息。 - SleepNot
谢谢!我更新了我的回答。 - robinkunde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接