我遇到了没有更新的进度条的问题(它是灰色的)。我有这个方法来更新MainViewController.m中的进度条:
- (void)setProgress:(float)prog {
NSLog(@"Progressbar updated, value %f", prog);
self.progressBar.progress = prog;
}
当我从类内部(MainViewController.m内)使用:
调用它时// in MainViewController.m
[self setProgress:1.0];
一切都很好,条形图显示蓝色的进度,我得到NSLog输出值。
有了这个进度条,我希望可视化我在另一个类(processing.m)中运行的循环中的处理,使用协议将带有进度的消息发送到MainViewController:
#import "progressProtocol.h"
@interface MainViewController : UIViewController <progressProtocol>
- (void)setProgress:(float)prog;
@end
并在processing.m中:
// in processing.m
[self.delegate setProgress:1.0];
当我通过协议发送消息来调用setProgress方法时,我只获得具有正确值的NSLog输出,但进度条没有根据值移动!当我在方法中设置断点时,我可以看到方法被调用但进度条没有移动。
在循环内部我发送带有新值的消息大约几个时间 - 但在进度条上没有任何变化,只有NSLog具有正确的值。有什么想法吗?
答案 0 :(得分:2)
听起来你在主线上做了这样的事情:
int steps = 10000
for (int step = 1; x < steps; x++) {
//Do something time-consuming that takes a few seconds.
viewController.setProgress((float)step/(float)steps)
}
那不行。
iOS中的UI更新仅在您的代码返回并访问事件循环时发生。
如果你有一个循环在主线程上执行一个耗时的任务,并且在完成之前没有返回,那么更新进度指示器的代码永远不会有机会更新UI。
相反,您应该编写代码来在后台线程上执行耗时的工作:
//Run the time-consuming loop on a background queue
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
int steps = 10000
for (int step = 1; x < steps; x++) {
//Do something time-consuming that takes a few seconds.
//As the loop progresses, send a message to update the progress
//indicator to the main thread.
dispatch_async(dispatch_get_main_queue(),
^{
viewController.setProgress((float)step/(float)steps)
}
}
}