2009-05-16 1 views
1

Есть ли способ отправить это сообщение, чтобы указать, что я предпочитаю, чтобы мой селектор выполнялся после всех ожидающих событий пользовательского интерфейса, если они есть? То есть. дайте моему таймеру aterDelay более низкий приоритет в очереди событий.perfomSelector: withObject: afterDelay: могу ли я запросить низкий приоритет?

ответ

0

Не напрямую. Если вы используете performSelector:withObject:afterDelay:, селектор выполняется на основной теме , поэтому по определению это произойдет после того, как будут выполнены все текущие «ожидающие» события пользовательского интерфейса, но это может быть в середине прокрутки или анимации, считаются одним непрерывным событием, но на самом деле являются сотнями отдельных.

Однако вы можете достичь чего-то подобного, используя performSelectorInBackground:withObject:, а затем вызывая [NSThread setThreadPriority:0.01] в вызываемом методе. Будьте осторожны - вы открываете фоновый поток, поэтому вы не можете делать никаких вызовов пользовательского интерфейса. Однако это позволит вам выполнять работу в фоновом потоке с меньшим приоритетом, чем основной поток пользовательского интерфейса. (Не забудьте настроить пул авторефератов, поскольку он находится в его собственной нити!)

+0

Спасибо. По крайней мере, я сейчас не стал преследовать красную селедку. Я посмотрю на подавляющую анимацию, так как у меня есть подозрение, что иногда делает мой пользовательский интерфейс невосприимчивым. –

5

Фактически, performSelector:withObject:afterDelay: не обязательно должен возникать на основной резьбе; поэтому существует отдельный метод performSelectorOnMainThread:withObject:waitUntilDone:. Документация performSelector:withObject:afterDelay: говорит

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

Если вы хотите, чтобы выполнить задачу в фоновом режиме, вы можете посмотреть в +[NSThread detachNewThreadSelector:toTarget:withObject:], который запустит новый поток для выполнения вашей задачи, и оставить интерфейс отзывчивым. Использование отдельного потока для выполнения долговременной задачи, которая в противном случае могла бы блокировать ваш интерфейс, в целом хорошая идея, но она добавляет сложности. Если вы не знакомы с потоками, у вас могут возникнуть ошибки, которые не будут иметь никакого смысла.

В комментарии выше вы упомянули, что, по вашему мнению, анимация может быть виновата в том, что ваш пользовательский интерфейс не отвечает. Если вы используете встроенную поддержку анимации (Core Animation или одна из оберток Cocoa), анимация не должна делать ваш пользовательский интерфейс неактуальным. Невосприимчивый пользовательский интерфейс обычно означает, что ваша программа выполняет большую работу по основному потоку, прежде чем позволить циклу запуска вернуться к обслуживанию событий пользовательского интерфейса.