iphone, как обновить графический интерфейс? - PullRequest
1 голос
/ 18 августа 2010

я пишу небольшое приложение для iphone (просто для удовольствия)

что я хочу:

если я нажимаю кнопку "обновить":

  • отправить что-нибудь на сервер
  • разобрать ответ сервера
  • обновить содержимое некоторых ярлыков на экране
  • показать ответ
  • воспроизвестисистемный звук // используя аудиоинструмент
  • спит несколько секунд, этого достаточно, чтобы завершить предыдущий системный звуковой вызов
  • делать другие вещи
  • end

на самом деле все работает, но ... по какой-то причине содержимое метки обновляется в конце метода / обратного вызова / функции, которая вызывается при нажатии кнопки "обновить".

что яделать неправильно?спасибо!

код:

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

2 голосов
/ 18 августа 2010

GUI отображается в runloop.Цикл не достигнет следующей итерации, пока ваш метод не завершится.Следовательно, ваш метод блокирует обновление представления.Либо используйте фоновый поток или таймер.

1 голос
/ 18 августа 2010

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

Решение состоит в том, чтобы использовать [NSTimer scheduledTimerWithTimeInterval:X_SEC target:self selector:@selector(doOtherStuff) userInfo:nil repeats:NO] вместо сна и делать другие вещи.

1 голос
/ 18 августа 2010

Вы не хотите использовать sleep там. Sleep останавливает весь процесс от продолжения, поэтому ваш ярлык обновляется только в конце функции. Я бы рекомендовал использовать NSTimer или performSelector:withObject:afterDelay: (см. здесь ).

0 голосов
/ 18 августа 2010

Как насчет выполнения вызова [self sendContent] в отдельном потоке?

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