LoginSignup
11
5

More than 5 years have passed since last update.

【Swift 4.0】 APIでキャッシュを無視してリクエストする方法

Last updated at Posted at 2018-07-22

先日、Alamofireを用いてAPIのリクエストを行っていたところ、キャッシュが原因で不具合が発生していたため、その時に行った対処法をご紹介します。

発生していた不具合

APIが一度リクエストされたあとにiPhone端末自体の時刻を過去の時間に戻したところ、以前のAPIのレスポンスが返却され、サーバのアクセスログにもログがなく、API自体がリクエストされていない。

対処法

URLRequestcachePolicy.reloadIgnoringLocalCacheDataを設定することでキャッシュを無視することができました。具体的には下記のようになります。

let request = URLRequest(url: URL(string: "https://example.tetsukick.com"),
                         cachePolicy: .reloadIgnoringLocalCacheData,
                         timeoutInterval: 5.0)

補足事項

cachePolicyには他にも下記の設定ができるようです。まだ実際に使用することはできておりませんが、ネットワークの通信状況によっては、あえてキャッシュのデータを返すようなこともできるのではと思います。

cachePolicy 説明
useProtocolCachePolicy 特定のURLロード要求に対して、プロトコル実装で定義されているキャッシング・ロジックがあればそれを使用します。
reloadIgnoringLocalCacheData ローカルに保存されたキャッシュデータを無視して取得します。
reloadIgnoringLocalAndRemoteCacheData ローカルのキャッシュデータに加え、ネットワーク途中のプロキシなども含めてキャッシュを無視して取得します。現在、使用不可の設定値
returnCacheDataElseLoad キャッシュデータがあれば、その有効期限などは考慮せずキャッシュを使います。なければ、取得します。
returnCacheDataDontLoad キャッシュデータがあれば、その有効期限などは考慮せずキャッシュを使います。なければ、失敗になります。
reloadRevalidatingCacheData HEADリクエストを発行し更新を確認します、更新があればリクエストを発行します。

参考資料

AlamofireでCache-Controlを設定する
[Swift] Alamofireでキャッシュを無効化してリクエストを発行する

更新履歴

2018/07/23 tokorom様より、ご指摘いただき、reloadIgnoringLocalAndRemoteCacheDatareloadIgnoringLocalCacheDataに変更いたしました。
下記、公式ドキュメントに記載の通り、現在実装されていないようです。
https://developer.apple.com/documentation/foundation/nsurlrequest/cachepolicy/reloadignoringlocalandremotecachedata
tokorom様ありがとうございます。

11
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5