サーバーから何千もの画像をダウンロードするタスク (iOS5 + のみ) に取り組んでいます。画像は特定のカテゴリに属し、各カテゴリには何百もの画像が含まれる場合があります。私がする必要があるのはこれです:-
1) アプリがアクティブな場合 (ユーザーが写真に関係のないアプリの他の領域を閲覧している場合でも)、アプリが不足している画像をバックグラウンドでダウンロードすることを確認します。
2) ユーザーが写真カテゴリをクリックすると、そのカテゴリ内の画像はすぐに表示する必要があるため、優先的にダウンロードする必要があります。
上記のすべては、イメージがまだオフラインで利用できない場合にのみ発生します。ダウンロードが完了すると、イメージはローカル ストレージから使用されます。
これを解決するために、私が使用しているロジックは次のとおりです:-
1) AppDelegate.m で、applicationDidBecomeActive
欠落している画像のダウンロードを開始します。これを行うには、Core Data クエリを作成し、欠落している画像を見つけて、バックグラウンド優先度のスレッドでダウンロードを開始します。このようなもの :-
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)
前もって感謝します。