Я работаю над задачей (только для 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)
Заранее спасибо.