我正在处理一项任务(仅限 iOS5 +),该任务涉及从服务器下载数千张图像。图像属于某些类别,每个类别可以有数百张图像。我需要做的是:-
1) 如果应用程序处于活动状态,请确保应用程序在后台下载任何丢失的图像(即使用户正在浏览应用程序的其他与照片无关的区域)。
2)当用户点击一个照片类别时,该类别中的图像必须作为高优先级下载,因为那些是需要立即可见的图像。
仅当图像尚未脱机可用时,才会发生上述所有情况。下载后,将使用本地存储中的图像。
为了解决这个问题,我使用的逻辑是这样的:-
1) 在 AppDelegate.m 中applicationDidBecomeActive
,我开始下载任何丢失的图像。为此,我进行了核心数据查询,找出丢失的图像,并开始在具有背景优先级的线程中下载它们。像这样的东西:-
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];
}
这可行,但它会阻塞主 UI,并且应用程序会在一段时间后崩溃。这是我尝试下载大约 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)
提前致谢。