我正在加载一个文件,并希望在UIProgressView中显示进度。我可以设置初始值:
[loadingProgressView setProgress: 0.00];
..在viewDidLoad中,这非常有效。
我唯一要做的就是每个循环向条形图添加0.1,但不会更新:
while (eOF != 99999) {
...
[loadingProgressView setProgress:loadingProgressView.progress + 0.10];
}
我已经检查过,但每次循环时都没有真正找到任何更新栏。
任何可以就此分享一些建议的人吗?
--- --- UPDATE
尝试了这个没有成功:
while (eOF != 99999) {
...
[loadingProgressView setProgress:loadingProgressView.progress + 0.10];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];
}
答案 0 :(得分:11)
您正在循环阻塞主线程的while循环,在主线程可用之前,UI元素将无法刷新。解决此问题的最佳方法是在后台线程中运行此代码(在主线程上进行UI调用)。
或者(我不确定这个,见this discussion)你通过调用
让主线有一些喘息的空间NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]];
[[NSRunLoop currentRunLoop] runUntilDate:futureDate];
答案 1 :(得分:4)
UI作为运行循环的一部分进行更新,在此循环期间不会发生。你可以通过调用它来运行它:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]];
这会强制循环更新UI等。
答案 2 :(得分:4)
我的最终解决方案
首先,如果这是关闭此线程的错误方法,我会道歉!
经过大量的测试和调查后,我终于按照以下方式显示了我的UIProgressView:
while (eOF != 99999) {
...
[NSThread sleepForTimeInterval: 0.01];
[self performSelectorOnMainThread: @selector(makeMyProgressBarMoving) withObject: nil waitUntilDone: NO];
}
-(void)makeMyProgressBarMoving {
float actual = [loadingProgressView progress];
loadingProgressView.progress = actual + receivedData;
}
......现在终于完美无缺: - )
但是,感谢所有的帮助,我从中学到了很多。
答案 3 :(得分:2)
我想在这种情况下,正确的方法是使用块和多线程。您的代码将如下所示:
dispatch_queue_t myQueue = dispatch_queue_create("my queue", NULL);
dispatch_async(myQueue, ^
{
while (eOF != 99999) {
// ...
// your code
// ...
dispatch_async(dispatch_get_main_queue(), ^{
loadingProgressView.progress += 0.10;
});
}
});
dispatch_release(myQueue);
欲了解更多信息,请参阅Paul Hegarty的讲座http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id480479762讲座10,非常清晰的解释和教程。
答案 4 :(得分:0)
你可以试试几件事。
首先,检查UIProgressView的当前值是什么(在增加它之前)
即
float progress = loadingProgressView.progress;
[loadingProgressView setProgress: progress+0.10];
(在该行上设置断点以查看进度是否增加)
其次,通过以下方式强制更新:
[loadingProgressView setNeedsDisplay];
然后看看会发生什么。