/ / ETN का उपयोग करते हुए AFNetworking कैशिंग

ईटीएजी - आईओएस, ऑब्जेक्ट-सी, कैशिंग, afnetworking, nsurlcache का उपयोग कर AFNetworking कैशिंग

मुझे कैशिंग का उपयोग करने में समस्या हैAFNetworking और ETag मान। मेरा सर्वर हर अनुरोध के लिए कैश-कंट्रोल और ईटैग हेडर मान लौटाता है। लेकिन अगर मैं उसी संसाधन के लिए एक दूसरा अनुरोध करता हूं, तो AFNetworking जीता "t add etag। क्या मुझे मैन्युअल रूप से प्रत्येक प्रतिक्रिया के लिए etag बचाना चाहिए जो मुझे मिला और इसे अगले अनुरोधों के लिए संलग्न करें?

एप्लिकेशन प्रतिनिधि में मैंने कैश ऑब्जेक्ट सेट किया है:

 NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];

इसके अलावा, मैं AFHTTPRequestSerializer की डिफ़ॉल्ट कैश नीति का उपयोग कर रहा हूं।

किसी भी विचार समस्या क्या है? हो सकता है कि मैं http कैशिंग के विचार को नहीं समझता हूँ। जहाँ तक मुझे पता है कि यह पारदर्शी होना चाहिए, और मुझे हर प्रतिक्रिया के लिए ETag और कैश-कंट्रोल हेडर संलग्न करना है।

संपादित करें:

प्रतिक्रिया के हेडर इस तरह दिखते हैं:

"Cache-Control" = "max-age=3600";
"Content-Encoding" = gzip;
"Content-Type" = "application/json; charset=utf-8";
Date = "Wed, 05 Aug 2015 07:52:33 GMT";
Etag = "W/f6c8a0f47deb7db0eeea3069061de9ab";
Expires = "Wed, 05 Aug 2015 08:52:30 GMT";
"Last-Modified" = "Wed, 05 Aug 2015 08:52:30 GMT";
Server = "cloudflare-nginx";
Vary = "Accept-Encoding";
"cf-ray" = "2110ec564bde0afc-WAW";
"x-cache-id" = "api_3447fddb8680ed5d082ae871e95214dc";
"x-powered-by" = "PHP/5.5.19";
"x-whom" = "www-stage02-b"

उत्तर:

जवाब के लिए 0 № 1

यह जाँचने के लिए कि आपका AFHTTPRequestOperation कैश से आ रहा है या नहीं, आप इस कोड का उपयोग कर सकते हैं:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
NSMutableURLRequest* mutableRequest = [request mutableCopy];
BOOL __block responseFromCache = YES;

AFHTTPRequestOperation* operation = [super HTTPRequestOperationWithRequest:mutableRequest
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSString* source = responseFromCache ? @"CACHE" : @"SERVER";
NSLog(@"Request from %@", source);
success(operation, responseObject);
}
failure:nil];

[operation setCacheResponseBlock:
^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
responseFromCache = NO;
return cachedResponse;
}];

return operation;
}

सुनिश्चित करें कि जब आपका एप्लिकेशन चलना शुरू हो, तो आप NSURLCache को भी सक्षम करें।

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:5 * 1024 * 1024
diskCapacity:50 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];