Article

Accessing Cached Data キャッシュされたデータにアクセスする

Control how URL requests make use of previously cached data. どのようにURLリクエストが以前にキャッシュされたデータを利用するかを制御します。

Overview 概要

The URL Loading System caches responses both in memory and on disk, improving performance and reducing network traffic. URLローディングシステムは、メモリ中にそしてディスク上での両方で応答をキャッシュして、性能を改善してネットワーク流通量を減少しています。

The URLCache class is used for caching responses from network resources. Your app can directly access the shared cache instance by using the shared property of URLCache. Or, you can create your own caches for different purposes, setting distinct caches on your URLSessionConfiguration objects. URLCacheクラスは、ネットワークリソースからの応答をキャッシュするために使われます。あなたのアプリは、直接に共有キャッシュインスタンスにアクセスすることが、URLCachesharedプロパティを使うことによって行えます。または、あなたはあなた独自のキャッシュを異なる目的のために作成することが、あなたのURLSessionConfigurationオブジェクトそれら上で別個にキャッシュを設定して、行えます。

Set a Cache Policy for URL Requests URLリクエストに対するキャッシュ方針を設定する

Each URLRequest instance contains a URLRequest.CachePolicy object to indicate if and how caching should be performed. You can change this policy to control caching for the request. URLRequestインスタンスは、あるURLRequest.CachePolicyオブジェクトを含んで、キャッシュが実行されるべきかそしてどのようにかを指し示します。あなたは、この方針を変更することで、リクエストに対するキャッシュを制御できます。

For convenience, URLSessionConfiguration has a property called requestCachePolicy; all requests created from sessions that use this configuration inherit their cache policy from the configuration. 便宜のために、URLSessionConfigurationrequestCachePolicyと呼ばれるあるプロパティを持ちます;この構成設定を使うセッションから作成されるすべてのリクエストは、それらのキャッシュ方針をその構成設定から継承します。

The behaviors of the various policies are described in Table 1. This table shows the policies’ respective preferences for loading from cache or from the originating source, like a server or the local file system. Currently, only HTTP and HTTPS responses are cached. For FTP and file URLs, the only effect of a policy is to determine whether the request is allowed to access the originating source. さまざまな方針の挙動は、表 1で記述されます。この表は、キャッシュからまたは、サーバーまたはローカルファイルシステムといったその由来しているソースからロードすることに対する、それら方針のもつそれぞれの優先設定を示します。現在、HTTPとHTTPS応答だけがキャッシュされます。FTPとファイルURLに対して、ある方針の唯一の効果は、リクエストがその由来しているソースにアクセスを許されるかどうか決定することだけになります。

Table 1 Cache policies and their behaviors 表 1 キャッシュ方針とそれらの挙動

Cache policy キャッシュ方針

Local cache ローカルキャッシュ

Originating source 由来するソース

NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData

Ignored 無視される

Accessed exclusively 排他的にアクセスされる

NSURLRequest.CachePolicy.returnCacheDataDontLoad

Accessed exclusively 排他的にアクセスされる

Ignored 無視される

NSURLRequest.CachePolicy.returnCacheDataElseLoad

Tried first 最初に試みられる

Accessed only if needed 必要とされる場合にのみアクセスされる

NSURLRequest.CachePolicy.useProtocolCachePolicy

Depends on protocol プロトコルに依存する

Depends on protocol プロトコルに依存する

For an explanation of how useProtocolCachePolicy is implemented for HTTP and HTTPS, see NSURLRequest.CachePolicy. useProtocolCachePolicy is the default value for a URLRequest object. どのようにuseProtocolCachePolicyがHTTPおよびHTTPSに対して実装されるかの説明として、NSURLRequest.CachePolicyを見てください。useProtocolCachePolicyURLRequestオブジェクトに対する省略時の値です。

Access the Cache Directly キャッシュに直接にアクセスする

You can get or set the cache object used by a URLSession object by using the urlCache property of the session’s configuration object. あなたは、URLSessionオブジェクトで使われるキャッシュオブジェクトを、セッションのもつconfigurationオブジェクトのurlCacheプロパティを使うことによって取得または設定できます。

To look for the cached response to a given request, call cachedResponse(for:) on the cache. If cached data exists for the request, this call returns a CachedURLResponse object; otherwise, it returns nil. ある与えられたリクエストに対するキャッシュされた応答を検索するには、cachedResponse(for:)をキャッシュ上で呼び出してください。キャッシュされたデータがそのリクエストに対して存在するならば、この呼び出しはCachedURLResponseオブジェクトを返します;そうでなければ、それはnilを返します。

You can inspect resources used by the cache. The properties currentDiskUsage and diskCapacity represent the file system resources used by the cache, and currentMemoryUsage and memoryCapacity represent memory use. あなたは、キャッシュによって使われるリソースを検査できます。プロパティcurrentDiskUsagediskCapacityは、キャッシュによって使われるファイルシステムリソースを表します、そしてcurrentMemoryUsagememoryCapacityはメモリ用途を表します。

You can remove cached data for individual items with removeCachedResponse(for:). You can also clear out many cached items simultaneously with removeCachedResponses(since:), which removes cached items past a given date, or removeAllCachedResponses(), which wipes the entire cache. あなたは、個々の項目に対するキャッシュされたデータをremoveCachedResponse(for:)で取り除けます。あなたはまた、多くのキャッシュされた項目を同時に、与えられた日付を過ぎたキャッシュされた項目を取り除くremoveCachedResponses(since:)、またはキャッシュ全体を拭い去るremoveAllCachedResponses()で一掃できます。

Manage Caching Programmatically プログラムに基づいてキャッシュを管理する

You can write to the cache programmatically, with the storeCachedResponse(_:for:) method, passing in a new CachedURLResponse object and a URLRequest object. あなたは、キャッシュをプログラムに基づいて書き出すことが、storeCachedResponse(_:for:)メソッドで、新しいCachedURLResponseオブジェクトとURLRequestオブジェクトを渡して、行えます。

Typically, you manage the caching of a response while it’s being handled by a URLSessionTask object. To manage caching on a per-response basis, implement the urlSession(_:dataTask:willCacheResponse:completionHandler:) method of the URLSessionDataDelegate protocol. Note that this delegate method is called only for uploads and data tasks, and is not called for sessions with a background or ephemeral configuration. 概して、あなたはある応答のキャッシュを、それがURLSessionTaskオブジェクトによって取り扱われている間に管理します。応答毎基準でキャッシュを管理するには、URLSessionDataDelegateプロトコルのurlSession(_:dataTask:willCacheResponse:completionHandler:)メソッドを実装してください。この委任先メソッドはアップロードおよびデータタスクに対してのみ呼び出される、そしてバックグラウンドや短期使用の構成設定でのセッションに対して呼び出されないことに注意してください。

The delegate receives two parameters: a CachedURLResponse object and a completion handler. Your delegate must call this completion handler directly, passing in one of the following: 委任先は、2つのパラメータ:CachedURLResponseオブジェクトと完了ハンドラを受け取ります。あなたの委任先は、この完了ハンドラを、以下の1つを渡して、直接に呼び出す必要があります

  • The provided CachedURLResponse object, to cache the proposed response as-is 提供されたCachedURLResponseオブジェクト、提出された応答をそのままでキャッシュするために

  • nil, to prevent caching nil、キャッシュを防ぐために

  • A newly created CachedURLResponse object, typically based on the provided object, but with a modified storagePolicy and userInfo dictionary, as you see fit 新しく作成されたCachedURLResponseオブジェクト、概して提供されたオブジェクトに基づく、しかし修正されたstoragePolicyuserInfo辞書で、あなたの好きなように

Listing 1 shows an implementation of urlSession(_:dataTask:willCacheResponse:completionHandler:), which intercepts responses to HTTPS requests and allows the responses to be stored in the in-memory cache only. コード出力 1 は、urlSession(_:dataTask:willCacheResponse:completionHandler:)のある実装を示します、それは、HTTPSリクエストに対する応答を横取りして、そして応答にインメモリキャッシュのみに格納されることを許します。

Listing 1 Handling the urlSession(_:dataTask:willCacheResponse:completionHandler:) callback コード出力 1 urlSession(_:dataTask:willCacheResponse:completionHandler:) コールバックの取り扱い

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask,
                willCacheResponse proposedResponse: CachedURLResponse,
                completionHandler: @escaping (CachedURLResponse?) -> Void) {
    if proposedResponse.response.url?.scheme == "https" {
        let updatedResponse = CachedURLResponse(response: proposedResponse.response,
                                                data: proposedResponse.data,
                                                userInfo: proposedResponse.userInfo,
                                                storagePolicy: .allowedInMemoryOnly)
        completionHandler(updatedResponse)
    } else {
        completionHandler(proposedResponse)
    }
}

See Also 参照

Cache Behavior キャッシュ挙動