我有一个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
似乎只在解析器完成后才会触发。
有人能发现错误吗?
答案 0 :(得分:2)
这是你的问题:
NSXML解析器在主线程上运行,大约需要30秒才能运行。
所以你的NSXMLParser阻塞了主线程,因此在NSXMLParser完成之前,你发送的块没有被执行。
由于NSXMLParser无论如何都在主线程上运行,你可以直接删除dispatch_async
并直接在progressView.progress
更新modelLoadingProgressUpdate:
。
或者,您可以在后台线程上运行NSXMLParser,在这种情况下,它不会阻止主线程,并且在您发送后很快就会运行进度更新块。