14

私は AFNetworking を使用しており、1 回の応答でデータを数分間キャッシュする必要があります。したがって、アプリのデリゲートで NSUrlCache を設定し、リクエストでそれを設定します。

NSMutableURLRequest *request = //obtain request; 
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

有効期限を設定する方法: データが n 分以上前にロードされた場合、ディスクではなくサーバーから応答を求めますか?

編集:

サーバーがキャッシュをサポートしていないと仮定すると、コードで管理する必要があります。

4

3 に答える 3

19

だから、私は解決策を見つけました。

アイデアは、connection:willCacheResponse:メソッドを使用することです。応答をキャッシュする前にそれが実行され、そこで応答を変更して新しいものを返すか、nil を返すことができ、応答はキャッシュされません。私は AFNetworking を使用しているので、操作には便利な方法があります。

- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block;

コードを追加:

  [operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    if([connection currentRequest].cachePolicy == NSURLRequestUseProtocolCachePolicy) {
      cachedResponse = [cachedResponse responseWithExpirationDuration:60];
    }
    return cachedResponse;
  }];

responseWithExpirationDurationカテゴリからの場所:

@interface NSCachedURLResponse (Expiration)
-(NSCachedURLResponse*)responseWithExpirationDuration:(int)duration;
@end

@implementation NSCachedURLResponse (Expiration)

-(NSCachedURLResponse*)responseWithExpirationDuration:(int)duration {
  NSCachedURLResponse* cachedResponse = self;
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)[cachedResponse response];
  NSDictionary *headers = [httpResponse allHeaderFields];
  NSMutableDictionary* newHeaders = [headers mutableCopy];

  newHeaders[@"Cache-Control"] = [NSString stringWithFormat:@"max-age=%i", duration];
  [newHeaders removeObjectForKey:@"Expires"];
  [newHeaders removeObjectForKey:@"s-maxage"];

  NSHTTPURLResponse* newResponse = [[NSHTTPURLResponse alloc] initWithURL:httpResponse.URL
                                                               statusCode:httpResponse.statusCode
                                                              HTTPVersion:@"HTTP/1.1"
                                                             headerFields:newHeaders];

  cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:newResponse
                                                            data:[cachedResponse.data mutableCopy]
                                                        userInfo:newHeaders
                                                   storagePolicy:cachedResponse.storagePolicy];
  return cachedResponse;
}

@end

したがって、 http/1.1に従って http ヘッダーに有効期限を秒単位で設定します 。そのためには、次のいずれかのヘッダーを設定する必要があります: Expires、Cache-Control: s-maxage または max-age プロパティが読み取り専用で、新しいオブジェクトを返します。

于 2013-11-08T14:53:16.207 に答える
1

の応答の有効期限は、HTTP 応答NSURLCacheのヘッダーによって制御されます。Cache-Control

編集質問を更新したようです。サーバーが応答で Cache-Control ヘッダーを提供しない場合、キャッシュされません。そのエンドポイントへのすべてのリクエストは、キャッシュされたレスポンスを返すのではなく、エンドポイントをロードします。

于 2013-11-08T09:59:37.270 に答える