perfomSelector: withObject: afterDelay: я могу попросить низкий приоритет? - PullRequest
1 голос
/ 16 мая 2009

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

Ответы [ 2 ]

5 голосов
/ 16 мая 2009

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

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

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

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

0 голосов
/ 16 мая 2009

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

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

...