我正在使用NSTimer来更新UIProgressView,以便每秒将progess增加0.1。
-(void)updateBar{
NSLog(@"Increase by 0.1");
pbar.progress=pbar.progress+0.1;
}
-(void)foo{
NSLog("START Foo");
//Does some stuff that takes about 10sec
NSLog("FINISH Foo");
}
-(void) viewDidLoad{
pbar = [[UIProgressView alloc] initWithFrame:CGRectMake(-280, 500, 730, 90)];
pbar.progressViewStyle = UIProgressViewStyleDefault;
pbar.progressTintColor = [UIColor colorWithRed:68.0/255 green:186.0/255 blue:41.0/255 alpha:1.0];
pbar.progress = 0.0;
pbar.transform = CGAffineTransformMakeRotation(90 * M_PI / 180.0);
[self.view addSubview:pbar];
[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateBar) userInfo:nil repeats: YES];
[self foo];
}
理想情况下,在foo方法运行期间,UIProgressView的进度会增加。但是,在foo方法完成后计时器启动,所以我的控制台最终看起来像这样......
START Foo
FINISH Foo
Increase by 0.1
Increase by 0.1
Increase by 0.1
And so on ....
知道为什么会这样吗?更重要的是,我如何让它做我想做的事情并让计时器在调用foo之前开始运行。
答案 0 :(得分:0)
您正在调用的特定方法“scheduledTimerWithTimeInterval
”在当前运行循环上运行计时器,这解释了为什么“foo”会在计时器触发之前执行此操作。 / p>
如果你想在一个单独的(后台)线程上运行,为什么不创建&分离一个线程(or blocks, here's a related question that might help you out),然后在单独的线程上运行相同的调用。当然,如果您正在执行与UI相关的任何操作,则必须在主线程上进行实际的UI更新。因此,当计时器在一个单独的线程上运行时,在主线程上执行实际的UI内容(通过类似“performSelectorOnMainThread:
”的内容。)
答案 1 :(得分:0)
- (void) updateBar
方法在运行循环中延迟,而- (void) foo
则立即执行。
当您实现了代码时,您将缺少用于结束计时器的NSTimer
的引用(特别是实例变量)。
您可以使用- (void) foo
方法末尾的变量来停止计时器。