Призывая спать (5); и обновление текстового поля не работает - PullRequest
6 голосов
/ 29 апреля 2011

Я пытаюсь уснуть методом (см. Ниже), но вместо того, чтобы textLabel менялся со значения myTextLabelString, жду 5 секунд, меняю на «сон 5 сработал», жду 5 секунд и, наконец, меняю "сон 5 работал во второй раз" .... он просто переходит от значения myTextLabelString, ждет 10 секунд, а затем изменяется на "сон 5 работал во второй раз".

- (void)textLabelChanger:(id)sender {

    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    

    textLabel.text=myTextLabelString;
    sleep(5);
    textLabel.text=@"sleep 5 worked";
    sleep(5);
    textLabel.text=@"sleep 5 worked second time round";
    return;
}

Ответы [ 4 ]

11 голосов
/ 29 апреля 2011

Это, вероятно, даст результат, который вы ищете:

-(void)textLabelChanger:(id)sender
{
    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    
    textLabel.text=myTextLabelString;

    [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked" afterDelay:5.0];
    [self performSelector:@selector(updateTextLabelWithString:) withObject:@"sleep 5 worked second time round" afterDelay:10.0];
}

-(void)updateTextLabelWithString:(NSString*)theString
{
    textLabel.text=theString;
}

Есть много способов сделать это. Вместо одного updateTextLabelWithString, который вы вызываете дважды с разными задержками, у вас может быть doFirstTextUpdate, который записывает «сон 5 сработал», а затем вызывает другой селектор, такой как doSecondTextUpdate, используя ту же технику [self performSelector:] после еще 5 вторая задержка.

Чрезвычайно редко вам нужно использовать метод sleep() с Objective-C.

-(void)textLabelChanger:(id)sender
{
    NSString *myTextLabelString = [NSString stringWithFormat:@"%d", gameCountDown];    
    textLabel.text=myTextLabelString;

    [self performSelector:@selector(firstUpdate) withObject:nil afterDelay:5.0];
}
-(void)firstUpdate
{
    textLabel.text = @"sleep 5 worked";
    [self performSelector:@selector(secondUpdate) withObject:nil afterDelay:5.0];
}
-(void)secondUpdate
{
    textLabel.text = @"sleep 5 worked second time round";
}
3 голосов
/ 29 апреля 2011

Изменения в компонентах UIKit обычно не вступают в силу до тех пор, пока вы не вернетесь в runloop.Поскольку вы никогда не блокируете основной поток преднамеренно (и, как я полагаю, ваш код является просто тестом сна, а не тем, что вы на самом деле хотите делать), это обычно не проблема.

Вместо NSLog попробуйте вместоустановив свойство 'text', если вы действительно хотите убедиться, что режим сна работает (все журналы имеют временную метку), используйте executeSelector: afterDelay: если вы хотите, чтобы что-то происходило в главном потоке после паузы.

2 голосов
/ 29 апреля 2011

Как уже упоминалось, блокировка основного потока, вероятно, не то, что вы хотите сделать. Вместо того, чтобы пытаться помешать вашему приложению делать что-либо, в том числе перерисовывать экран или реагировать на прикосновения, в течение 5 секунд подумайте о проблеме под другим углом. Создайте NSTimer, чтобы запланировать вызов метода на 5 секунд в будущем, и пусть ваше приложение продолжит работать, пока вы ждете срабатывания таймера.

2 голосов
/ 29 апреля 2011

Это классическая проблема практически со всеми инструментами программирования GUI.Если вы спите в потоке обработки событий, то этот поток связан, и он не может обновить экран.Если вам нужно выполнять текущую работу, которая периодически обновляет экран, то вы должны выполнять эту работу в отдельном потоке;это то, что вы должны сделать здесь.

...