使用GCD更新UIProgressView - 正确的时间 - iPhone

时间:2012-03-06 16:43:02

标签: iphone objective-c xcode multithreading grand-central-dispatch

我有一个UIProgress视图,我想在NSXML Parser运行时更新。 NSXML解析器在主线程上运行,大约需要30秒才能运行。

在解析部分的末尾,我在我的app delegate中调用一个方法:

[appDelegate updateLoadingScreen:0.75];

然后,app委托调用loadingScreen中的modelLoadingProgressUpdate方法:

- (void)updateLoadingScreen : (float)progress {
NSLog(@"PROGRESS REQUEST !!!");

NSNumber * progressNS = [NSNumber numberWithFloat:progress];

[loadingScreen modelLoadingProgressUpdate : progressNS];

}

modelLoadingProgressUpdate方法然后使用调度队列来更新UIProgressBar:

- (void) modelLoadingProgressUpdate :(NSNumber *)progress {

dispatch_queue_t mainqueue = dispatch_get_main_queue();
dispatch_async(mainqueue, ^  { 

float updateProgress = [progress floatValue];
NSLog(@"Update Progress is %f", updateProgress);

progressView.progress = updateProgress;

});

}

但是我的UIProgressView上没有更新任何内容。 modelLoadingProgressUpdate似乎只在解析器完成后才会触发。

有人能发现错误吗?

1 个答案:

答案 0 :(得分:2)

这是你的问题:

  

NSXML解析器在主线程上运行,大约需要30秒才能运行。

所以你的NSXMLParser阻塞了主线程,因此在NSXMLParser完成之前,你发送的块没有被执行。

由于NSXMLParser无论如何都在主线程上运行,你可以直接删除dispatch_async并直接在progressView.progress更新modelLoadingProgressUpdate:

或者,您可以在后台线程上运行NSXMLParser,在这种情况下,它不会阻止主线程,并且在您发送后很快就会运行进度更新块。