2012-02-25 75 views
0

嗨香港专业教育学院得到了一个有趣的问题,我的所有代码..福斯特:UIObject类不更新屏幕上的画面(位置)

- (void)viewDidLoad 
{ 

[super viewDidLoad]; 
didStart=YES; 
[NSThread detachNewThreadSelector:@selector(updateGame:) toTarget:self withObject:nil]; 
} 

-(void)updateGame:(id)sender{ 

while (1) { 
    NSLog(@"getting called"); 
    CGRect frame= self.label.frame; 
    frame.origin.y+=1; 
    self.label.frame=frame; 
    [self.label removeFromSuperview]; 
    [self.view addSubview:self.label]; 
    NSLog(@"%f",frame.origin.y); 
} 


} 

基本上我实现一个游戏循环。但是,尽管我确信这个循环已经被调用,但标签不会在屏幕上移动。任何想法可能是什么问题?

回答

3

UIKit Framework Reference

注:在大多数情况下,UIKit类应该只从应用程序的主线程中使用。对于派生自UIResponder的类或者以任何方式涉及操纵应用程序用户界面的类尤其如此。

如果您的游戏世界更新代码速度很快,您可以使用NSTimer定期在主线程上运行游戏更新。

如果您的游戏世界更新代码很慢,您将希望在后台线程上运行它,更新模型对象。然后通知主线程(可能使用dispatch_asyncperformSelectorOnMainThread:withObject:waitUntilDone:)来更新UI。但是,如果您可以在主线程上运行更新代码,那么您将不太会像竞争条件那样出现多线程问题。

+0

谢谢!解决了问题! – iJatrat 2012-02-25 19:03:56

0

UIKit不是线程安全的。你不应该从另一个线程更新UI。

0

除了其他答案之外,您不能以您所展示的方式在循环中执行此类动画,因为它们在您从方法返回之前实际上没有任何影响,因此UIKit可以执行重绘。您可以通过代替循环来实现此目的,在延迟之后使用执行选择器排队另一个调用方法。