executeSelectorOnMainThread не выполняется - PullRequest
5 голосов
/ 27 октября 2011

Разорвите мои волосы на этом, любые мысли или предложения будут с благодарностью.

У меня есть объект, который вызывает performSelectorOnMainThread:withObject:waitUntilDone: для себя из дочернего потока. Это отлично работает в 95% случаев. Время от времени, так как iOS бета-версии, а теперь и в выпуске, устройство будет отказываться выполнять вызовы performSelectorOnMainThread:withObject:waitUntilDone: ... Нет сообщения об ошибке, оно не вылетает, я не могу заставить устройство перейти в состояние, когда оно «происходит сбой», но как только он появляется, он продолжает отказывать, пока я не удаляю и не переустанавливаю приложение, или не заставляю его завершать работу, затем настраиваю его допуск на услуги определения местоположения, затем снова запускаю его, затем повторно настраиваю его службы определения местоположения снова к нормально ... перезапуск устройства не исправляет. Переустановка без удаления сначала не исправляет это. Это очень странно .... Я знаю, что это работает большую часть времени, потому что большинство устройств не имеют проблем, однако некоторые устройства иногда выходят из строя несколько раз (возможно, каждые 3-4 дня). Я точно знаю, что performSelectorOnMainThread:withObject:waitUntilDone: не вызывает то, что должно, потому что у меня сейчас неисправное устройство, и я добавил NSLog в метод, который должен быть вызван. Он работает нормально, но на неисправном устройстве, когда performSelectorOnMainThread:withObject:waitUntilDone: используется для вызова этого метода, NSLog показывает, что он не запускается ...

Это начало происходить с бета-версиями iOS 5 и снова происходит после релиза. Это происходит чаще всего на 2 моих устройствах, но ни на одном из 10 других устройств, на которых я лично тестировал. Я предположил, что это было только мое устройство от некоторого сбоя в бета-версии, но это происходит на моем новом 4S, которое никогда не касалось беты, а также на iPad 2 одного пользователя (не на моем iPad 2).

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

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

executeSelectorOnMainThread: withObject: waitUntilDone иногда может быть шатким.Задумывались ли вы о попытке использовать диспетчеризацию lib?

Вы можете создать блок и разместить его в главном потоке следующим образом:

dispatch_async(dispatch_get_main_queue(), ^{
    <do work here>
});

Это будет иметь такой же эффект сохранения, как при использовании performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0 голосов
/ 01 октября 2015

Поток RunLoop имеет несколько различных режимов. Возможно, что во время вашего звонка основной поток работает в режиме, отличном от режима по умолчанию (на который нацелен performSelectorOnMainThread:withObject:WaitUntilDone:.

Рассмотрите возможность использования performSelectorOnMainThread:withObject:waitUntilDone:modes:
См. документацию Apple .

Также - GCD (libdispatch) потрясающий, но он не защитит вас от тупиковой ситуации: Рассмотрим случай, когда ваш метод выполняется в основном потоке, и вы вызываете:

dispatch_sync(dispatch_get_main_queue(), ^{
    <do work here>
});
...