AFNetworking を使用して、約 100 枚の画像をバックグラウンドでダウンロードし、アプリ内の他のネットワーク接続が優先されるようにしながら、それらをディスクに保存する必要があります。
~~~~~~~
4 つのタブを持つアプリケーションがあります。各タブは基本的に同じことを行います。サーバーから JSON 応答を取得し、画像のサムネイル グリッドを表示し、必要に応じて各画像を取得します (AF の ImageView カテゴリを使用)。サムネイルをタップすると、詳細ビュー コントローラーが表示され、大きな画像が表示されます。タブごとに反応やイメージが異なります。
4 番目のタブのすべての画像を事前に取得するという新しい要件があるため、理論的には、ユーザーが 4 番目のタブをタップするまでに、JSON データと画像がディスクから読み取られます。
メインスレッドがロックアップしないように、バックグラウンドスレッドで実行されている4番目のタブのプリフェッチとディスクへの保存により、これは現在多かれ少なかれ機能しています。ただし、ユーザーが 1 番目、2 番目、または 3 番目のタブにいるときに開始されるネットワーク リクエストは、プリフェッチ ネットワーク リクエストによってブロックされています。
私は AFNetworking を使用しており、Tab 1、2、または 3 の読み込み時に使用しているコードは次のとおりです。
// this network request ends up getting blocked by the network request that
// is fired upon the application becoming active
- (void)getAllObjectDataWithBlock:(AFCompletionBlockWrapper)block
{
[[[MyAPIClient] sharedClient] getPath:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
block(operation, responseObject, nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
block(operation, nil, error);
}];
}
そして、アプリケーションがアクティブになったときに 4 番目のタブのコンテンツをプリフェッチするために使用しているコードは次のとおりです。
// this network request runs in the background, but still blocks requests
// that should have a higher priority
- (void)applicationDidBecomeActive:(UIApplication *)application
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSOperationQueue *imageQueue = [[NSOperationQueue alloc] init];
[imageQueue setMaxConcurrentOperationCount:8];
for (NSString *imageURL in self.images) {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL imageURL]];
AFImageRequestOperation *operation = [[AFImageRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"success");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"fail");
}];
[imageQueue addOperation:smallOperation];
}
});
}
メイン スレッドから開始されたネットワーク リクエストが、バックグラウンド スレッドで開始されたネットワーク リクエストに割り込むようにするにはどうすればよいでしょうか?