AFNetworking + NsOperationQueue — загрузка тысяч изображений

Я работаю над задачей (только для iOS5+), которая включает в себя загрузку тысяч изображений с сервера. Изображения принадлежат к определенным категориям, и в каждой категории могут быть сотни изображений. Что мне нужно сделать, так это: -

1) Убедитесь, что приложение загружает все отсутствующие изображения в фоновом режиме, если приложение активно (даже когда пользователь просматривает некоторые другие области приложения, которые не связаны с фотографиями).

2) Когда пользователь щелкает категорию фотографий, изображения в этой категории должны загружаться с высоким приоритетом, поскольку именно они должны быть видны немедленно.

Все вышеперечисленное происходит только в том случае, если изображение еще не доступно в автономном режиме. После загрузки изображение будет использоваться из локального хранилища.

Чтобы решить эту проблему, я использую следующую логику:

1) В AppDelegate.m, в applicationDidBecomeActiveя начинаю скачивать все отсутствующие изображения. Для этого я делаю запрос Core Data, узнаю, каких изображений не хватает, и запускаю их загрузку в потоке с приоритетом BACKGROUND. Что-то вроде этого: -

 dispatch_queue_t imageDownloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(imageDownloadQueue, ^{
    [DataDownloader downloadMissingImages];
});
dispatch_release(imageDownloadQueue);

Код downloadMissingImagesвыглядит так: -

NSOperationQueue *downloadQueue = [[NSOperationQueue alloc] init];
        downloadQueue.maxConcurrentOperationCount = 20;

        for(MyImage *img in matches)
        {
            NSURLRequest *request = [NSURLRequest requestWithURL:img.photoUrl];
            AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:request success:^(UIImage *image) {

                [MyImage imageFromAPI:image inManagedObjectContext:document.managedObjectContext];

                NSLog(@"Successfully downloaded image for %@", img.title);      
            }];

            [downloadQueue addOperation:operation];
        }

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

2) Когда пользователь нажимает на категорию, мне нужно сначала загрузить эти изображения, так как они должны быть немедленно показаны пользователю. Я не уверен, как я могу прервать вызов MissingImages и сказать ему начать загрузку определенных изображений раньше других.

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

Я не знаю, как заставить это работать эффективно. Есть предположения?

Журналы сбоев выглядят так

PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
PAPP(36373,0xb065f000) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Jun 24 11:39:45 MacBook-Pro.local PAPP[36373] <Error>: ImageIO: JPEG    Insufficient memory (case 4)

Заранее спасибо.

8
задан Anuj Gakhar 24 June 2012 в 10:44
поделиться