Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios-下载期间阻止主线程_Ios_Multithreading_Download_Afnetworking 2_Sdwebimage - Fatal编程技术网

ios-下载期间阻止主线程

ios-下载期间阻止主线程,ios,multithreading,download,afnetworking-2,sdwebimage,Ios,Multithreading,Download,Afnetworking 2,Sdwebimage,我使用AFNetworking下载了大约200张图片。问题是主线程在下载期间被阻塞,而不是在成功/失败阻塞期间。 这是我的密码: imageDownloads=[[NSMutableArray alloc]init]; for(NSString *url in liens){ NSString *totalURL = [NSString stringWithFormat:@"http://%@", url]; [imageDownloads addObject:[[ImageDo

我使用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];
}
imageDownloads=[[NSMutableArray alloc]init];
for(留置权中的NSString*url){
NSString*totalURL=[NSString stringWithFormat:@“http://%@”,url];
[imageDownloads addObject:[[ImageDownloadAlloc]initWithURL:[NSURL URLWithString:totalURL]文件名:nil]];
}
对于(int i=0;i

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

您正在更新进度块中的进度视图。因为AFNetworking本质上是异步的,所以每个请求都将同时堆叠和运行。如果你运行了200个,这将冻结应用程序。尝试使用
NSOperationQueue
来限制并发线程的数量


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

您正在更新进度块中的进度视图。因为AFNetworking本质上是异步的,所以每个请求都将同时堆叠和运行。如果你运行了200个,这将冻结应用程序。尝试使用
NSOperationQueue
来限制并发线程的数量



或者,您可以省去所有的麻烦,直接使用。

您尝试过使用dispatch\u async吗?然后在完成块中,您可以返回到主线程。我不太清楚在什么时候我必须在这里使用dispatch\u async?在异步块中构建整个请求-只需确保当完成块调用任何UI更新时,它们在主线程上被调用。请看这一点:异步应该包含在AFNetworking中…添加了一个答案以使其更清晰您是否尝试过使用dispatch\u async?然后在完成块中,您可以返回到主线程。我不太清楚在什么时候我必须在这里使用dispatch\u async?在异步块中构建整个请求-只需确保当完成块调用任何UI更新时,它们在主线程上被调用。看看这个:异步应该包含在AFNetworking中…添加了一个答案使它更清晰谢谢你的帮助。当我读到这个问题时:我似乎明白AFM网络本身应该是异步的,对吧?Hrm很好。您正在更新进度块中的进度UI-其中有多少同时运行?我重新分析了我的代码,并得出以下结论:下载是异步进行的,但问题是一旦一次下载完成,它就会调用成功块(位于主线程上),依此类推(它们都一个接一个地完成了)。因此主线程仍然被阻塞,这就是为什么进度没有更新…我该怎么办?(大约有150张图片/块)我已经看过了,但是你觉得我的新评论怎么样?我认为这是这里的主要问题。你也可以考虑使用像SDWEBIMAGE之类的东西,它会自动完成所有这些工作。非常感谢你的帮助。当我读到这个问题的时候:我似乎明白,AfNoad本身已经是异步的,对吗?要点。您正在更新进度块中的进度UI-其中有多少同时运行?我已经分析了我的代码,下面是我的结论:下载是异步进行的,但问题是一旦一次下载完成,它就会调用成功块(在主线程上),依此类推(它们都一个接一个地完成了)。因此主线程仍然被阻塞,这就是为什么进度没有更新…我该怎么办?(大约有150张图片/块)我已经看过了,但是你对我的新评论有什么看法?我认为这是这里的主要问题!你也可以考虑使用像SDWebVIDEM这样的东西,它将自动完成所有这些任务。