executeSelector: withObject: afterDelay в viewDidAppear не работает при запуске приложения - PullRequest
1 голос
/ 15 сентября 2011

Мне нужно переместить некоторый код из viewDidAppear в новый селектор, чтобы сработать через 0,1f секунды.Таким образом, я сделал что-то вроде:

-(void) viewDidAppear:(BOOL)animated{
    [self performSelector:@selector(startShowing) withObject:nil afterDelay:0.1f];      
}

-(void) startShowing{
    NSLog(@"start Showing");
    ............
}

Когда я запускаю приложение, ничего не происходит, «Показ начала» не появляется.Если я меняю вид, а затем возвращаюсь к первому, он работает.

Кто-нибудь знает почему?

1 Ответ

2 голосов
/ 18 октября 2011

Проблема заключается в том, что задержка зависит от базовой реализации NSTimer, которая основана на NSRunLoop, который создается к моменту завершения запуска приложения.

Из Руководства по программированию потоков :

"При выполнении селектора в потоке [a] целевой поток должен иметь активный цикл выполнения. Для создаваемых потоков это означает ожидание, пока ваш код явно не запустит цикл выполнения. Поскольку основной поток запускает свой собственный цикл выполнения однако вы можете начать выполнять вызовы в этом потоке , как только приложение вызовет applicationDidFinishLaunching: метод делегата приложения. Цикл выполнения обрабатывает все вызовы селектора выполнения в очереди каждый раз в цикле, вместо обработки один во время каждой итерации цикла. "

Итак, проверьте, не сработало ли applicationDidFinishLaunching :. Вы сказали, что только что запустили приложение. Могу поспорить, что запуск еще не завершен.

Если это проблема, вы можете исправить это несколькими способами. Самым простым для меня является вызов executeSelector: withObject: afterDelay: from applicationDidFinishLaunching.

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