Изображение не отображается в detachNewThreadSelector - PullRequest
1 голос
/ 13 октября 2010

У меня проблемы с игрой, и мне было интересно, кто-нибудь может помочь?

Я загружаю наложенное изображение на экран, когда пользователь нажимает на ответ в моей игре-викторине, изображение имеет галочку или крестик, чтобы указать, был ли ответ правильным. Изображение загружается в новую тему.

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

Что еще более странно, так это то, что несколько месяцев назад у меня была игра, готовая для iOS3, и эта проблема не возникала, она только начиналась при обновлении до iOS4.

Вот код:

Изображения создаются в методе loadView:

 tick = [UIImageView alloc];
 [tick initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];
 [tick setImage:[UIImage imageNamed:@"correct.png"]];

 cross = [UIImageView alloc];
 [cross initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)];
 [cross setImage:[UIImage imageNamed:@"wrong.png"]];

Нити называются здесь:

-(void)answerAttempt:(UIButton *)b{
     ansQues++;
     if([b.currentTitle isEqualToString:ans]){
      [NSThread detachNewThreadSelector: @selector(showTick) toTarget:self withObject:nil];
      [appDelegate playSound:1]; 
      score++;
                ...
                ...
                ...
 }else{
  [NSThread detachNewThreadSelector: @selector(showCross) toTarget:self withObject:nil];
  [appDelegate playSound:0];
 }

Вот функция, вызываемая двумя потоками:

-(void)showTick{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [tick setHidden:NO];
 [levelPage addSubview:tick];
 [levelPage bringSubviewToFront: tick];

 usleep(500000);

 [tick removeFromSuperview];
 [pool release];
}

-(void)showCross{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 [cross setHidden:NO];
 [levelPage addSubview:cross];
 [levelPage bringSubviewToFront: cross];

 usleep(500000); 

 [cross removeFromSuperview];
 [pool release];
}

Как вы могли бы сказать по коду, я пробовал разные способы, чтобы каждый раз отображать его, но какое-то время не нашел никакого решения. Я проверил, чтобы убедиться, что каждый раз вызывается правильный поток, и он это делает - просто UIImage для галочки и крестика не отображается.

Пожалуйста, не стесняйтесь задавать любые дополнительные вопросы.

Спасибо.

1 Ответ

4 голосов
/ 13 октября 2010

Все обновления пользовательского интерфейса должны выполняться в главном потоке. Кроме того, если вы спите в своем коде, дизайн, вероятно, не верен, но если вы застряли на том, чтобы делать это таким образом, то простое решение - это сделать:

[levelPage performSelectorOnMainThread:@selector(addSubview:) withObject:cross waitUntilFinished:NO];
...