2013-04-15 3 views
0

У меня есть рабочий поток, который я поддерживаю через цикл, управляемый флагом. Мне нужен поток, чтобы остаться в живых по длине моего приложения, так как он открывает постоянное соединение с удаленным сервером.Долговечная нить не вызывает performSelectorOnMainThread

Я запустим эту нить и вызвать несколько методов по нему:

[worker performSelector:@selector(getBusy) onThread:worker withObject:nil waitUntilDone:NO];

Это, кажется, работает хорошо, и метод. В какой-то момент в getBusy я пытаюсь вызвать метод в основном потоке с:

[delegate performSelectorOnMainThread:@selector(gotBusy) withObject:nil waitUntilDone:NO

где делегат является ссылкой на класс, который запускает отдельный поток.

Проблема в том, что gotBusy никогда не вызывается в основной теме. Я набросал это с помощью операторов NSLog(), и я не могу их распечатать на консоли.

Что я должен искать для отладки?

ответ

2

Во-первых, удостоверьтесь, что delegate не ноль. Во-вторых, убедитесь, что ваш основной цикл событий не заблокирован и не работает в модальном режиме.

+0

Да, основной ровный цикл спал. Ваш комментарий заставил лампочку загореться в моей голове. – ruipacheco

+0

Отлично - обратите внимание, что вы никогда не должны блокировать или спать основной нить. Вы также должны избегать планирования большого количества мелкозернистых событий (например, таймер, который отключается каждые 1/10 секунды для опроса данных). – bbum

+0

Это единичный тест. Я вызвал сон, когда флаг был установлен в false и не понимал, что блокирует фоновый поток от вызова основного потока. – ruipacheco

0

Возможно ли, что вы никогда не назначали delegate, так что вы звоните performSelectorOnMainThread на ноль? Вы можете попробовать установить waitUntilDone на YES, чтобы ваш рабочий поток блокировал и позволял делегату выполнять свою работу.

+0

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

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

  • Нет связанных вопросов^_^