2012-06-29 4 views
0

У меня есть диспетчер модального представления, который появляется, проверяет сервис в Интернете и затем увольняет себя, когда это делается. Наконечник содержит индикатор активности и метку, чтобы информировать пользователя о том, что происходит.performSelector: withObject: afterDelay: не работает на контроллере modal view

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

#pragma mark - AssetLoaderServiceDelegate 

- (void)assetLoaderServiceDidFinishLoading:(AssetLoaderService *)service 
{ 
    [self.spinner stopAnimating]; 
    self.infoLabel.text = @"Update complete"; 
    [self performSelector:@selector(dismissUpdater) withObject:nil afterDelay:2.0]; 
} 

- (void)dismissUpdater 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Но по какой-то причине селектор никогда не вызывается. Я тоже пытался запустить его в режиме NSRunLoopCommonModes, но это тоже не работает.

я должен делать что-то неправильно, но я не могу увидеть, что ...

EDIT: Делегат обратного вызова на самом деле происходит внутри NSOperationQueue, что может означать, что это не в том же потоке, когда он посылает сообщение обратно в контроллер просмотра? Так что я попытался

[self performSelector:@selector(downloadQueueComplete) withObject:nil afterDelay:0.0 inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; 

следуют

- (void)downloadQueueComplete 
{ 
    [delegate assetLoaderServiceDidFinishLoading:self]; 
} 

Но не кажется performSelector работать и здесь.

+0

ли увольнение упущеного не вызвано, или уклонение методаModalViewControllerAnimated не работает? – rishi

+0

Вы имеете в виду: 1. вызывается 'assetLoaderServiceDidFinishLoading'; 2. Модальный просмотр всегда там? – sergio

+0

@rishi - Я имею в виду, что увольнение не получает. – jowie

ответ

2

Вслед за ваше предложение о выпуске нити, вы бы попробовать с:

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]]; 
+0

Да, получил тот же ответ в то же время, спасибо! Мне не нужен бит 'NSRunLoopCommonModes', но кроме этого проблема решена. Cheers :) – jowie

+0

это настоящая синхронность ... и благодарю за принятие моего ответа, когда на самом деле вы были там сами по себе ... – sergio

+0

это справедливо - я попросил вас, ребята, о помощи;) – jowie

1

отсортированных! В AssetLoaderService, я должен был выполнить селектор на главном потоке:

[self performSelectorOnMainThread:@selector(downloadQueueComplete) withObject:nil waitUntilDone:YES]; 

После этого все последующие вызовы были на правильном потоке. :)

Смежные вопросы