ios - AFNetworking在下载期间阻止主线程

时间:2015-09-12 16:29:44

标签: ios multithreading download afnetworking-2

我正在使用AFNetworking下载更多或更少的200张图片。问题是主线程在下载期间被阻止,而不是在成功/失败块期间。 这是我的代码:

imageDownloads=[[NSMutableArray alloc]init];
for(NSString *url in liens){
    NSString *totalURL = [NSString stringWithFormat:@"http://%@", url];
    [imageDownloads addObject:[[ImageDownload alloc] initWithURL:[NSURL URLWithString:totalURL] filename:nil]];
}
for (int i=0; i < imageDownloads.count; i++)
{
    ImageDownload *imageDownload = imageDownloads[i];
    [self downloadImageFromURL:imageDownload];
}



   - (void)downloadImageFromURL:(ImageDownload *)imageDownload
{
    NSURLRequest *request = [NSURLRequest requestWithURL:imageDownload.url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        imageDownload.totalBytesRead = totalBytesRead;
        imageDownload.totalBytesExpected = totalBytesExpectedToRead;
        [self updateProgressView];
    }];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSAssert([responseObject isKindOfClass:[NSData class]], @"expected NSData");

        imageDownload.totalBytesExpected = imageDownload.totalBytesRead;
        [self updateProgressView];
        //all kind of basic stuff here I left out: I get store the data inside CoreData
        NSLog(@"finished %@", imageDownload);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error %@", error);
    }];
    [operation start];
}

基本上,当我启动代码时,线程被阻塞了30-40秒(图片总共大约100MB),然后我突然看到所有的NSLog日志都显示为“已完成”......文本。那部分如果真的很快。但我认为AFNetworking不应该在我下载时阻止主线程?这也不允许我跟踪下载的进度......我做错了什么或误解了什么?

1 个答案:

答案 0 :(得分:0)

您正在更新进度块中的进度视图。因为AFNetworking本质上是异步的,所以这些请求中的每一个都将同时堆叠和运行。如果您正在运行其中的200个,则会冻结该应用。尝试使用NSOperationQueue&#39; maxConcurrentOperationCount来限制并发线程数。

或者,您可以省去所有麻烦,只需使用