UIObject не обновляет фрейм (позицию) на экране - PullRequest
0 голосов
/ 25 февраля 2012

Привет У меня возникла забавная проблема. Прежде всего мой код:

- (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 ]

3 голосов
/ 25 февраля 2012

Из UIKit Framework Reference :

Примечание: По большей части классы UIKit должны использоваться только из основного потока приложения. Это особенно верно для классов, производных от UIResponder или связанных с каким-либо образом манипулированием пользовательским интерфейсом вашего приложения.

Если ваш код обновления игрового мира быстрый, вы можете просто использовать NSTimer для периодического запуска обновления игры в главном потоке.

Если ваш код обновления игрового мира идет медленно, вы можете запустить его в фоновом потоке, обновляя объекты модели. Затем вы уведомляете основной поток (возможно, используя dispatch_async или performSelectorOnMainThread:withObject:waitUntilDone:) для обновления пользовательского интерфейса. Но если вы сможете запустить свой код обновления в главном потоке, вы будете гораздо менее подвержены многопоточным проблемам, таким как условия гонки.

0 голосов
/ 25 февраля 2012

В дополнение к другим ответам, вы не можете делать анимации, подобные этой, в цикле, как вы показали, потому что они на самом деле не оказывают никакого влияния, пока вы не вернетесь из своего метода, чтобы UIKit мог делать перерисовки.Этого можно добиться, не зацикливаясь, а ставя в очередь другой вызов метода с помощью селектора выполнения после задержки.

0 голосов
/ 25 февраля 2012

UIKit не является потокобезопасным. Вы никогда не должны обновлять пользовательский интерфейс из другого потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...