UIObject不更新屏幕上的帧(位置)

时间:2012-02-25 18:33:52

标签: iphone objective-c ios cocoa-touch

嗨,我有一个有趣的问题..我的所有代码最糟糕:

- (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 个答案:

答案 0 :(得分:3)

来自UIKit Framework Reference

  

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

除了其他答案之外,你不能以你所显示的方式循环播放这样的动画,因为它们实际上没有任何影响,直到你从你的方法返回,所以UIKit可以进行重绘。您可以通过而不是循环来实现这一点,在延迟之后使用执行选择器对该方法进行另一次调用排队。