我正在为iphone编写一个小应用程序(只是为了好玩)
我想要的是什么:
如果我按下“更新”按钮:
实际上,一切正常但是......出于某种原因,标签内容在按下“更新”按钮时调用的方法/回调/函数的末尾更新。
我在做错了什么? 谢谢!一些代码:
-(void) playASound: (NSString *) file {
//Get the filename of the sound file:
NSString *path = [NSString stringWithFormat:@"%@/%@",
[[NSBundle mainBundle] resourcePath],
file];
SystemSoundID soundID;
//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
//play the file
AudioServicesPlaySystemSound(soundID);
}
- (IBAction)update: (id) sender{
BOOL error=[self sendContent];
if ( error == NO ){
result.text=[self parseContent];
[self playSound:@"ready"];
sleep(4);
....
}
// here is updated the gui
}
答案 0 :(得分:2)
GUI由runloop显示。在您的方法执行完毕之前,循环不会到达下一次迭代。因此,您的方法会阻止视图更新。使用后台线程或计时器。
答案 1 :(得分:1)
您不想在那里使用sleep
。睡眠会使整个过程停止,这就是为什么只有在功能结束时才更新标签的原因。我建议您使用NSTimer
或performSelector:withObject:afterDelay:
(请参阅here)。
答案 2 :(得分:1)
这是因为您在sleep
时阻止了主线程。 UI只能在主线程上绘制。
解决方案是使用[NSTimer scheduledTimerWithTimeInterval:X_SEC target:self selector:@selector(doOtherStuff) userInfo:nil repeats:NO]
代替睡眠并做其他事情。
答案 3 :(得分:0)
如何在单独的线程中执行[self sendContent]
调用?