Не забывайте об основном потоке


Не забывайте об основном потоке

Если же указать в первом аргументе другой приоритет, например, DISPATCH_QUEUE_ PRIORITY_HIGH (высокий приоритет диспетчеризации очереди) или DISPATCH_QUEUE_ PRIORITY_LOW (низкий приоритет диспетчеризации очереди), э передача нулевого аргумента означает то же самое, что и DISPATCH_QUEUE_PRIORIT¥_DEFAULT (исходный приоритет диспетчеризации очереди), то фактически будет получена совсем другая глобальная очередь, приоритетность для которой система устанавливает иначе. Остановимся пока что на используемой по умолчанию приоритетной очереди.

Очередь затем передается функции dispatch asyncO наряду со следующим далее блоком кода. Диспетчер GCD берет далее весь этот блок и передает его фоновому потоку, где он будет выполняться поочередно, как если бы это делалось в основном потоке.

Единственный недостаток рассматриваемого здесь кода заключается в том, что каркас UIKit не является потокобезопасным. Напомним, что передача любого объекта графического интерфейса пользователя, в том числе resultsTextView — текстового представления результатов, из фонового потока запрещена. Правда, диспетчер GCD предоставляет нам способ преодолеть и это препятствие. Внутри блока мы можем вызвать другую функцию диспетчеризации, передав выполняемую работу обратно основному потоку! С этой целью мы должны опять вызвать функцию dispatch_async О, но на этот раз передать ей очередь, возвращаемую функцией dispatchget mainqueue(), которая всегда предоставляет специальную очередь, существующую в основном потоке и готовую к выполнению тех блоков, которым требуется использовать основной поток. Итак, внесите в рассматриваемый здесь вариант метода doWork: изменения, выделенные ниже полужирным.

Если скомпилировать и выполнить рассматриваемое здесь приложение в данный момент, то можно заметить, что оно теперь работает чуть более гладко — по крайней мере, в некотором отношении. В частности, кнопка не залипает в выбранном положении после ее касания, что, вероятно, вызывает желание постучать по ней еще и еще раз. Если же просмотреть журнал консольных сообщений в среде Xcode, то можно обнаружить результаты каждого постукивания по кнопке, хотя в текстовом представлении будут показаны результаты только последнего постукивания.
  • Дата: 2-01-2015, 12:46

Предыдущие статьи сайта:

Понравилась статья? Ставь лайки, рассказывай друзьям!



Отзывы о статье: Не забывайте об основном потоке

Технологии, секреты и фишки Apple: Iphone, iPad, iPod