UIProgressView不会更新

时间:2013-06-21 23:58:01

标签: ios6 xcode4.5 grand-central-dispatch uiprogressview

如果重要: - 我正在使用故事板 - 核心数据 - xcode 4.6

我的应用程序有一个特定视图的UITableViewController。在该视图中,如果用户单击按钮,则软件将经历一些过程,其中数据从Internet API下载并保存到核心数据中。我确信这是一种资源匮乏,这就是我试图在不同的线程中完成这些进程的原因。

注意: - 有一个操作顺序,因为腿依赖于交换。交换取决于种族和职位。职位取决于种族。否则我会以异步方式执行所有操作。

问题: - 这是我第一次与Grand Central Dispatch合作。我不确定我是否正确地做到了。 - 如果我注释掉数据处理,UIProgressView可见并按预期更新。随着数据处理的到位,系统似乎陷入困境,甚至无法显示UIProgressView。

管理下载和进度的方法如下。


- (IBAction)downloadNow:(id)sender {

[progressView setHidden:NO];
[progressView setProgress:0.1 animated:YES];

dispatch_sync(backgroundQueue, ^(void){
    [self saveRace];
    [self updateProgress:0.2];
});

dispatch_sync(backgroundQueue, ^(void){
    [self savePositions];
    [self updateProgress:0.3];
});

dispatch_sync(backgroundQueue, ^(void){
    [self downloadExchanges];
    [self saveExchanges];
    [self updateProgress:0.4];
});

dispatch_sync(backgroundQueue, ^(void){
    [self downloadLegs];
    [self saveLegs];
    [self updateProgress:0.5];
});

dispatch_sync(backgroundQueue, ^(void){
    Utilities *utilities = [[Utilities alloc] init];
    [utilities calculateStartTimes:race with:managedObjectContext];
    [self updateProgress:1.0];
});

}

  • (void)updateProgress:(double)completedPercentage { if (completedPercentage == 1.0) { [self goHome]; } else if ([importExchanges count] > 0) { [progressView setProgress:completedPercentage animated:YES]; } }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

方法dispatch_sync将阻塞调用线程,我相信你的情况是主线程。所以我认为最好将这些dispatch_sync块包装到一个dispatch_async块中。

举个例子:

dispatch_async(backgroundQueue, ^(void){
    [self saveRace];
    [self updateProgress:0.2];

    [self savePositions];
    [self updateProgress:0.3];

    [self downloadExchanges];
    [self saveExchanges];
    [self updateProgress:0.4];

    [self downloadLegs];
    [self saveLegs];
    [self updateProgress:0.5];

    Utilities *utilities = [[Utilities alloc] init];
    [utilities calculateStartTimes:race with:managedObjectContext];
    [self updateProgress:1.0];
});

之后,您可以将progressView的更新包装在主线程中,因为它是一个UI更新。

- (void)updateProgress:(double)completedPercentage {
    if (completedPercentage == 1.0) {
        [self goHome];
    } else if ([importExchanges count] > 0) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [progressView setProgress:completedPercentage animated:YES];
        });
    }
}