iphone,如何刷新gui?

时间:2010-08-17 22:01:27

标签: iphone objective-c iphone-sdk-3.0

我正在为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
}

4 个答案:

答案 0 :(得分:2)

GUI由runloop显示。在您的方法执行完毕之前,循环不会到达下一次迭代。因此,您的方法会阻止视图更新。使用后台线程或计时器。

答案 1 :(得分:1)

您不想在那里使用sleep。睡眠会使整个过程停止,这就是为什么只有在功能结束时才更新标签的原因。我建议您使用NSTimerperformSelector:withObject:afterDelay:(请参阅here)。

答案 2 :(得分:1)

这是因为您在sleep时阻止了主线程。 UI只能在主线程上绘制。

解决方案是使用[NSTimer scheduledTimerWithTimeInterval:X_SEC target:self selector:@selector(doOtherStuff) userInfo:nil repeats:NO]代替睡眠并做其他事情。

答案 3 :(得分:0)

如何在单独的线程中执行[self sendContent]调用?