3

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];
        }
    });
}

メイン スレッドから開始されたネットワーク リクエストが、バックグラウンド スレッドで開始されたネットワーク リクエストに割り込むようにするにはどうすればよいでしょうか?

4

1 に答える 1

3

送信したくない場合を除き、実行中の操作を簡単に中断できるかどうかはわかりませんが、 が に注意を払っているcancelかどうかを確認する必要があります。AFImageRequestOperationisCancelled

setQueuePriorityを使用してみましたか? すべてのプリフェッチ リクエストを低い優先度で開始してから、現在のタブ リクエストをより高い優先度で追加できます。実行中の操作は完了すると思いますが、完了すると、優先度の高い操作がキューに入れられた優先度の低い操作よりも先にスケジュールされます。

于 2012-08-31T17:29:00.197 に答える