0

私の iOS アプリでは、何百もの画像をダウンロードしています。

AFWorkingのリクエスト番号を管理したい。

これは私のコードです:

問題は、UI がブロックされることです。

助けてくれてTHX!

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);

for (NSString *urlString in self.downloadImageList) {
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_group_async(group, queue, ^{
        NSURL *url = [NSURL URLWithString:urlString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSString *filename = url.lastPathComponent;
        NSURL *outputFileURL = APPLICATION_DOCUMENTS_DIRECTORY;
        outputFileURL = [outputFileURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@/images/%@",self.boardId,filename]];

        dispatch_group_async(group, dispatch_get_main_queue(), ^{
            AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
            operation.outputStream = [NSOutputStream outputStreamWithURL:outputFileURL append:YES];
            [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
                [self.downloadImageList removeObject:urlString];
                NIDINFO(@"download success %@",filename);
                dispatch_semaphore_signal(semaphore);
            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                NIDERROR(@"download image error:%@\n%@",error,urlString);
                dispatch_semaphore_signal(semaphore);
            }];
            [operation start];
        });

    });
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore);
dispatch_release(group);
4

1 に答える 1

0

問題は、UI がブロックされることです。

そうですね、それがポイントのようなものですdispatch_semaphore_t。これらの呼び出しを削除すると、メイン/UI スレッドに影響を与えることなく、AFNetworking 呼び出しがバックグラウンドで非同期に実行されます。

このコードが使用されている場所の完全なコンテキストはわかりませんが、これを呼び出すメソッドがブロック パラメーターを受け取るようにすることを検討することをお勧めします。これは、すべての要求が終了したときに呼び出すことができます。また、AFHTTPClient のバッチ操作機能を確認することもできます。これにより、一連の操作の進行状況を追跡し、それぞれのコールバックを個別に取得し、すべての操作がいつ終了するかを確認できます。

于 2012-10-30T06:40:50.337 に答える