NSURLCache: говорит, что его кэширование, нет, и никаких изменений в статистике памяти

Я пытаюсь подтвердить URL-кэширование, регистрируя статистику памяти вокруг NSURLCache.

Я расширил базовую NSURLCache следующим образом:

@implementation  MarksCache : NSURLCache

- (NSCachedURLResponse *) cachedResponseForRequest:(NSURLRequest *)request;
{
    NSString *myString = [request.URL absoluteString];
    DDLogVerbose(@"URL CACHE GET : PRE  : %@ %d %d %d %d", myString,
                 [NSURLCache sharedURLCache].currentDiskUsage ,
                 [NSURLCache sharedURLCache].currentMemoryUsage,
                 [NSURLCache sharedURLCache].diskCapacity,
                 [NSURLCache sharedURLCache].memoryCapacity);

    NSCachedURLResponse *resp = [super cachedResponseForRequest:request];
    //NSURLResponse *rp = [resp response];
    //NSString *rpdesc = [rp description];

    //NSData *data = [resp data];
    //NSString *respdesc = [resp description];
    //NSString *selfdesc = [super description];

    DDLogVerbose(@"URL CACHE GET : POST : %@ %d %d %d %d", myString,
                 [NSURLCache sharedURLCache].currentDiskUsage ,
                 [NSURLCache sharedURLCache].currentMemoryUsage,
                 [NSURLCache sharedURLCache].diskCapacity,
                 [NSURLCache sharedURLCache].memoryCapacity);

    return resp;
}

- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request
{
    NSString *myString = [request.URL absoluteString];
    DDLogVerbose(@"URL CACHE SET : PRE  : %@ %d %d %d %d", myString,
                 [NSURLCache sharedURLCache].currentDiskUsage ,
                 [NSURLCache sharedURLCache].currentMemoryUsage,
                 [NSURLCache sharedURLCache].diskCapacity,
                 [NSURLCache sharedURLCache].memoryCapacity);
    [super cachedResponseForRequest:request];
    DDLogVerbose(@"URL CACHE SET : POST : %d %d %d %d",
                [NSURLCache sharedURLCache].currentDiskUsage ,
                [NSURLCache sharedURLCache].currentMemoryUsage,
                [NSURLCache sharedURLCache].diskCapacity,
                [NSURLCache sharedURLCache].memoryCapacity);
}

@end

У меня также есть код кнопки, который выполняет следующее:

- (IBAction)onClearButtonPress:(id) sender{
    DDLogVerbose(@"TestViewController onClearButtonPress : START : PRE : %d %d %d %d", 
    [NSURLCache sharedURLCache].currentDiskUsage , 
    [NSURLCache sharedURLCache].currentMemoryUsage, 
    [NSURLCache sharedURLCache].diskCapacity,  
    [NSURLCache sharedURLCache].memoryCapacity);

    [NSURLCache sharedURLCache].removeAllCachedResponses;

    DDLogVerbose(@"TestViewController onClearButtonPress : START : POST : %d %d %d %d", 
    [NSURLCache sharedURLCache].currentDiskUsage , 
    [NSURLCache sharedURLCache].currentMemoryUsage, 
    [NSURLCache sharedURLCache].diskCapacity,  
    [NSURLCache sharedURLCache].memoryCapacity);

    }

Когда я нажимаю несколько тестовых кнопок в моем представлении для запуска событий URLConnection, я вижу, что эти методы вызываются с правильными URL-адресами. Однако статистика использования кэш-памяти и диска НИКОГДА не меняется.

Пример из журнала

URL CACHE SET : PRE  : https://<domain.com>/resources/images/bg/bg-blue.png 1970176 0 10000000 512000
URL CACHE SET : POST : https://<domain.com>/resources/images/bg/bg-blue.png 1970176 0 10000000 512000

URL CACHE GET : PRE  : https://<domain.com>/resources/images/bg/bg-footer.png 1970176 0 10000000 512000
URL CACHE GET : POST : https://<domain.com>/resources/images/bg/bg-footer.png 1970176 0 10000000 512000

TestViewController onClearButtonPress : START : PRE : 1970176 0 10000000 512000
TestViewController onClearButtonPress : EXIT : POST : 1970176 0 10000000 512000

URL CACHE SET : PRE  : https://<domain.com>/resources/images/bg/bg-footer.png 1970176 0 10000000 512000
URL CACHE SET : POST : https://<domain.com>/resources/images/bg/bg-footer.png 1970176 0 10000000 512000

Это заставляет меня верить:

1 - я делаю что-то не так и не правильно наблюдаю за поведением кеша

2 - этот кеш на самом деле не кеширует

Любые мысли будут высоко ценится.

1 ответ

Решение

Я понял это некоторое время назад и хотел опубликовать ответ. Я сделал свой код делегатом для: NSURLConnection - connection:willCacheResponse

Этот метод позволяет вам переопределить поведение кэширования до того, как оно произойдет. Я просто поместил вход в систему, чтобы увидеть, что мой Ответ может быть кэширован, и забыл фактически выполнить любое кэширование. После исправления в моей памяти статистика действительно показывала элементы, входящие и выходящие из кэша.

Руководство по программированию системы загрузки URL

Другие вопросы по тегам