2016-11-30 52 views
-2

我得到未更新(那支灰色)的进度条的问题。我得到这个方法来更新MainViewController.m进度条:iOS的进度条不更新

- (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根据不移动到价值!?当我在方法内部设置断点时,我可以看到该方法被调用,但进度条不移动。

我送约几个hundert倍新值的消息在循环中 - 但在进度条一点变化都没有,只是用的NSLog正确的值。任何想法?

+2

检查什么是prog'的'当您使用协议调用它的价值。 – Frankie

+5

是否在主线程上更新了条形图?它必须。 – vadian

+0

@Frankie:我让NSLog也打印出prog'NSLog(@“Progressbar updated,value%f”,prog)的值;'并且该值传递正确! – Hecot

回答

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。

相反,你应该写你的代码,这样做在后台线程耗时的工作:

//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) 
     } 
    } 
    } 
+0

我已经根据你的方案进行了设置,并且进度条现在正在更新,但是在处理完成一定百分比后,崩溃:'对象0x1008b6a00的malloc:***错误:对于释放的对象 - 对象可能不正确的校验和在被释放之后进行修改。“之前的处理工作正常 - 您是否知道在哪里查看导致崩溃的内容? – Hecot

+0

存在与多线程编程相关的各种潜在问题。在我看来,当你的长时间运行过程仍在运行时,某些东西会被释放。最后用新代码更新您的问题,解释长时间运行的代码在做什么。 –