iphone – 如何在没有线程的循环中更新iOS中的UI元素?

我想从循环中更新标签,例如:

- (void)viewDidLoad {
    [super viewDidLoad];
    int i=0; 
    while (1) {
         i++;
         [NSThread sleepForTimeInterval:0.05];  // do some computation,
         [myLabel setText:[NSString stringWithFormat:@"%d", i]]; // show the result!
         [self.view setNeedsDisplay];
    }

  }

假设不是睡眠而是进行一些繁重的计算.
我不想在后台进行计算的开销.
用于处理此问题的Windows等效项将是.DoEvents,如此示例所示:
http://www.tek-tips.com/viewthread.cfm?qid=1305106&page=1

在iOS中是否有类似的解决方案?

[self.view setNeedsDisplay]根本不起作用!

必须有一些方法可以在主线程中以受控的时间表从iOS处理应用程序事件…就像Windows中的.DoEvents一样,尽管它的所有缺点对于一些简单的应用程序非常有用.

我想这就像游戏循环,但有UI组件.

最佳答案
你这样做的方式如下:

-(void) incrementCounter:(NSNumber *)i {             
    [myLabel setText:[NSString stringWithFormat:@"%d", [i intValue]]]; // show the result!
    [self performSelector:@selector(incrementCounter:) withObject:[NSNumber numberWithInt:i.intValue+1] afterDelay:0.05];    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // start the loop
    [self incrementCounter:[NSNumber numberWithInt:0]];
}

这里的基本思想是在稍微延迟0.05之后递增计数器,以使主UI线程有机会刷新所有UI事件,这构成了在Windows世界中显式调用.DoEvents.

转载注明原文:iphone – 如何在没有线程的循环中更新iOS中的UI元素? - 代码日志