Iphone 如何在iOS主线程上从UIProgressBar更新

Iphone 如何在iOS主线程上从UIProgressBar更新,iphone,ios,sdk,download,Iphone,Ios,Sdk,Download,我正在使用一种方法下载文档目录中的视频文件,它工作得非常好,我正在使用下面的代码在后台下载视频,但是在下载时,我需要更新进度条以及下载量,但是主线程没有更新 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *data = [NSData dataWithContentsOfURL: videoURL]; NSString *pathToDocs =

我正在使用一种方法下载文档目录中的视频文件,它工作得非常好,我正在使用下面的代码在后台下载视频,但是在下载时,我需要更新进度条以及下载量,但是主线程没有更新

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSData *data = [NSData dataWithContentsOfURL: videoURL];

    NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filename = [NSString stringWithFormat:@"%@.mp4",self.titleString];
    [data writeToFile:[pathToDocs stringByAppendingPathComponent:filename] atomically:YES];
    NSLog(@"File %@ successfully saved", filename);

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Succesfully Downloaded" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];

});

dataWithContentsOfURL
不会返回状态;它只是阻塞线程,直到完成下载。您需要使用异步的方法来报告进度


看一看AFNetworking(),因为它是为满足您的需要而设计的。

dataWithContentsOfURL
不会返回状态;它只是阻塞线程,直到完成下载。您需要使用异步的方法来报告进度


查看AFNetworking(),因为它被设计来做你正在寻找的。

< P>为了监视下载的进度,你应该考虑使用,在这里你可以使用<代码> NSURLCalnDeDATAdActudia<代码>方法来更新关于进度的UI。 如果您想知道需要多少数据,可以经常使用,对于HTTP URL,它可能包含预期的文件大小。(但并非所有web服务器都提供此功能。)


正如Richard所建议的,您可能需要考虑使用,因为它可以简化您的编程工作

> P>为了监视下载的进度,你应该考虑使用,在这里你可以使用<代码> nSurLnCaldDATAdAdvase<代码>方法来更新关于进度的UI。 如果您想知道需要多少数据,可以经常使用,对于HTTP URL,它可能包含预期的文件大小。(但并非所有web服务器都提供此功能。)


正如Richard所建议的,您可能需要考虑使用,因为它可以简化您的编程工作

尝试像这样更新主线程上的进度

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSData *data = [NSData dataWithContentsOfURL: videoURL];

        NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filename = [NSString stringWithFormat:@"%@.mp4",self.titleString];
        [data writeToFile:[pathToDocs stringByAppendingPathComponent:filename] atomically:YES];
        NSLog(@"File %@ successfully saved", filename);

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Succesfully Downloaded" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];

        dispatch_async(dispatch_get_main_queue(), ^(){
            //Task you want perform on mainQueue
            //Control Progressbar here

        });
    });

尝试像这样更新主线程上的进度

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSData *data = [NSData dataWithContentsOfURL: videoURL];

        NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filename = [NSString stringWithFormat:@"%@.mp4",self.titleString];
        [data writeToFile:[pathToDocs stringByAppendingPathComponent:filename] atomically:YES];
        NSLog(@"File %@ successfully saved", filename);

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Succesfully Downloaded" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];

        dispatch_async(dispatch_get_main_queue(), ^(){
            //Task you want perform on mainQueue
            //Control Progressbar here

        });
    });