iOS进度条没有更新

时间:2016-11-30 19:13:14

标签: ios objective-c iphone cocoa-touch

我遇到了没有更新的进度条的问题(它是灰色的)。我有这个方法来更新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具有正确的值。有什么想法吗?

1 个答案:

答案 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)
      }
    }
  }