web-dev-qa-db-ja.com

キャッシュポリシーがReloadIgnoringLocalAndRemoteCacheDataに設定されている場合でも、Alamofireがキャッシュからロードされる

ローカルキャッシュを無視するように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

    }

} 
}
_

制限付きオフラインモードなど、ネットワーク接続が利用できない場合にのみ、キャッシュからデータをロードしたいのですが、どうすればよいですか?

13
laughingman

私はプロジェクトでこの方法を使用していて、うまくいきます:

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...

それが役に立てば幸い。

12
Fábio Salata

おかげで@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 ...
7

ReloadIgnoringLocalAndRemoteCacheDataは実装されていません。

https://developer.Apple.com/reference/foundation/nsurlrequestcachepolicy/1408722-reloadignoringlocalandremotecach

http://nshipster.com/nsurlcache/

更新:iOS 13以降、NSURLRequest.CachePolicy.reloadRevalidatingCacheDataとNSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheDataが実装されています。 https://developer.Apple.com/documentation/ios_ipados_release_notes/ios_13_release_notes

5
robinkunde