Пользовательский интерфейс Какао: Задержанный executeSelector .... задержанный - PullRequest
2 голосов
/ 09 ноября 2011

Контекст :

В моем приложении Mac, когда я нажимаю на элемент списка, уведомление отправляется объекту, который делает что-то в фоновом режиме, в то время как в пользовательском интерфейсе есть ожидающее сообщение. Все это происходит в окне, которое вы можете закрыть кнопкой «Закрыть». Кнопка по умолчанию отключена при отправке уведомления.

То, что я хочу сделать, - это функция тайм-аута, которая позволяет пользователю выйти из этого окна через пару минут, следовательно, с помощью кнопки закрытия.

Код :

- (IBAction)onChangeOperator:(id)sender
{
    [self performSelector:@selector(timerFired:) withObject:nil afterDelay:2.0];
    ....
    ....
    //takes time
    ....
}

-(void) timerFired:(NSTimer *) theTimer {
[close_button setEnabled:YES];
}

Проблема : Кнопка не активна до тех пор, пока onChangeOperator не будет завершен, тогда как я хочу, чтобы она была включена, как только селектор сработал.

Я думаю, что это нить, но я не могу понять.

1 Ответ

2 голосов
/ 09 ноября 2011

Из документации performSelector:withObject:afterDelay:

Вызывает метод получателя в текущем потоке с использованием режима по умолчанию после задержки.

Таким образом, текущий поток все еще заблокирован. Вместо этого вы должны запустить вашу дорогую операцию в onChangeOperator в новом потоке:

- (IBAction)onChangeOperator:(id)sender 
{     
    [self performSelector:@selector(timerFired:) withObject:nil afterDelay:2.0];
    [self performSelectorInBackground:@selector(doUpdates) withObject:nil];
}

-(void) timerFired:(NSTimer *) theTimer 
{ 
    [close_button setEnabled:YES]; 
} 

-(void)doUpdates
{
    .... stuff that takes time....
}
...