0

在我的 iOS 应用程序中,我有数百张图片下载。

我使用 AFNetworking 来获取这些图像。我想管理 AFWorking 的请求编号。

这是我的代码:

问题是:它会阻止我的用户界面。

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

问题是:它会阻止我的用户界面。

嗯,是的,这就是重点dispatch_semaphore_t。如果您删除这些调用,您的 AFNetworking 调用将在后台异步执行,而不会影响您的主/UI 线程。

我不知道这段代码在哪里使用的完整上下文,但看起来你可能想要考虑让调用它的方法接受一个块参数,一旦所有请求完成就可以调用它。您可能还想看看 AFHTTPClient 的批处理操作功能,它允许您跟踪一组操作的进度,分别获取每个操作的回调,以及所有操作何时完成。

于 2012-10-30T06:40:50.337 回答