图像未出现在detachNewThreadSelector中

时间:2010-10-13 14:41:26

标签: iphone objective-c ios4 nsthread

我的游戏遇到了麻烦,想知道是否有人可以提供帮助?

当用户在我的测验游戏中点击答案时,我在屏幕上加载叠加图像,图像是勾号或十字形以指示答案是否正确。图像正在加载一个新线程。

问题在于,每次用户点击答案时图像都不会出现,而且在一轮中只出现约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 for tick和cross不显示。

请随时提出任何问题。

感谢。

1 个答案:

答案 0 :(得分:4)

所有UI更新都应在主线程上完成。此外,如果你在代码中睡觉,设计可能不对,但如果你坚持这样做,那么一个简单的解决方法就是这样做:

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