Кэширование большего изображения с помощью AFNetworking

Я новичок в AFNetworking и меньше опыта в разработке iOS.

Я использую AFNetworking для загрузки изображения из интернета, вот код:

- (void)dowloadPoject {

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

BOOL __block responseFromCache = YES; // yes by default

void (^requestSuccessBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^(AFHTTPRequestOperation *operation, id responseObject) {
    if (responseFromCache) {
        // response was returned from cache
        NSLog(@"RESPONSE FROM CACHE: %@", responseObject);
    }
    else {
        // response was returned from the server, not from cache
        NSLog(@"RESPONSE From Server: %@", responseObject);
    }

    UIImage *downloadedImage = [[UIImage alloc] init];
    downloadedImage = responseObject;

    // Add & Reload Data
    [self.projectImage addObject:downloadedImage];
    [self.projectname addObject:@"ABC"];
    [self reloadComingSoonProject];
    [self reloadNewReleaseProject];
};

void (^requestFailureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"ERROR: %@", error);
};

AFHTTPRequestOperation *operation = [manager GET:@"http://i359.photobucket.com/albums/oo34/SenaSLA/walls/Forward-Arrow-Button.png"
                                      parameters:nil
                                         success:requestSuccessBlock
                                         failure:requestFailureBlock];
operation.responseSerializer = [AFImageResponseSerializer serializer];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    NSLog(@"bytesRead: %u, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", bytesRead, totalBytesRead, totalBytesExpectedToRead);

    [self.viewNavBar.progressbar setProgress:(totalBytesRead/totalBytesExpectedToRead) animated:YES];
}];

[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    // this will be called whenever server returns status code 200, not 304
    responseFromCache = NO;
    return cachedResponse;
}];
}

Я искал в Интернете, и я до сих пор не могу найти правильное решение. Я попробовал это решение от Rckoenes, но это не работает для меня.

Мне удалось кэшировать изображение размером 4 КБ, но когда я пытаюсь использовать изображение размером 103 КБ, оно не кэшируется. Спасибо.

1 ответ

Вы можете попробовать увеличить размер кэша. В прошлый раз, когда я это проверял, сетевой код не кэшировался, если полученные данные превышали 5% от общего размера кэша (хотя, к сожалению, мне еще предстоит увидеть, как Apple четко сформулирует правила, применяемые во время кэширования).

В любом случае, если вы посмотрите на делегата приложения в примере проекта AFNetworking, это показывает и пример того, как указать размер кэша:

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

Похоже, что кэш-память по умолчанию составляет всего 0,5 МБ, а кэш-память диска - 10 МБ. Увеличив кэш-память ОЗУ до 4 МБ, как показано выше, или больше, вы сможете кэшировать свое изображение размером 103 КБ (при условии, что все остальные критерии, такие как поля заголовка ответа и т. П., Разрешают это).

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