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) Когда пользователь нажимает на категорию, мне нужно сначала загрузить эти изображения, так как они должны быть немедленно показаны пользователю. Я не уверен, как я могу прервать вызов отсутствующего изображения и сказать ему начать загрузку определенных изображений раньше других.
Итак, в основном мне нужно загрузить все отсутствующие изображения в фоновом режиме, но если пользователь просматривает категорию фотографий, эти изображения должны иметь высокий приоритет в очереди на загрузку.
Я в недоумении, как заставить это работать эффективно. Какие-нибудь мысли?
Журналы аварий выглядят так
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)
Заранее спасибо.