NSURLRequestCachePolicy を鵜呑みにしない

リクエストを生成するときのお馴染み NSURLRequestCachePolicy ですが、イメージと違う動きをするのが気になったので調べてみた.

tl;dr

enum NSURLRequestCachePolicy の

  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData
  • NSURLRequestReloadRevalidatingCacheData

は指定しても意味がない、もしくは意図しない挙動になる可能性があるので使わない方が良いかも.

ネット上の記事だと “NSURLRequestReloadIgnoringLocalAndRemoteCacheData を指定して〜…” とか書いてあるのをよく見かけるけど、諸々確認してみた結果、実際にはこれらの値は iOS SDK 上では未実装と考えるのが妥当なようです.

ちなみに確認したのは iOS 8.2 SDK だけど、 8.1 とか 7 系でも同じ感じ. 6 系以前は未確認です.

ヘッダファイルを見てみた

Xcode で ⌘ + クリック とかで参照できるやつです.

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0,

    NSURLRequestReloadIgnoringLocalCacheData = 1,
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};

さりげなく // Unimplemented って書いてありますね…

Apple のドキュメントを見てみた

Unimplemented なんて書いてあったらもちろん気になっちゃうので、公式ドキュメントを見てみた.

enum
{
   NSURLRequestUseProtocolCachePolicy = 0,
   NSURLRequestReloadIgnoringLocalCacheData = 1,
   NSURLRequestReturnCacheDataElseLoad = 2,
   NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;

確かに NSURLRequestReloadIgnoringLocalAndRemoteCacheData と NSURLRequestReloadRevalidatingCacheData のような値は存在しない.

ドキュメントのミスじゃないとすると、本当に未実装なんでしょう.

実際のキャッシュの挙動についてはまだ調査できてないけど、キャッシュ無効にしてるはずなのにちゃんと効いてないよーみたいなことになりそうですよね.

意図しない挙動を避けるためにも商売でリリースするアプリには使わないようにしよう…と思いました.

あぁ末恐ろしや.