Grand Central Dispatch в iOS на Swift. Очереди

Тип очередей: Queue Types

Serial

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

Данный тип очереди хорошо применять при доступе задач к общему ресурсу. Блокировка ресурса будет будет поочередной как и сами задачи.

Concurrent

Задачи выполняются одновременно,  порядок выполнения не гарантируется. Очевидно — это ускоряет процесс выполнения программы, но накладывает ограничения на владение и использование общих ресурсов.

//
// proSwift.ru
//

QOS_CLASS_USER_INTERACTIVE
QOS_CLASS_USER_INITIATED
QOS_CLASS_DEFAULT
QOS_CLASS_UTILITY
QOS_CLASS_BACKGROUND

Тип очереди, в которую будет передаваться та или иная задача определяется предопределенными классами Quality of Service. Эти классы определяют типы задач по приоритетам для соответствующей очереди. Вот как сам Apple определяет типы приоритетов задач:

User-interactive Задачи, которые обрабатывают взаимодействие с пользователем, например обновление пользовательского интерфейса или выполнении анимации. Если уменьшить приоритет у таких задач, то пользовательский интерфейс может сильно тормозить. Очередь с данным QOS ориентирована на оперативность и производительность. Выполнение задачи происходит практически мгновенно.

Пример — обработка скроллинга, обновление экрана 60 раз в секунду.

User-initiated Задачи, которые пользователь инициировал и требует немедленных результатов, таких как открытие сохраненного документа или выполнения действий, которые требуются от программы после выбора пользователем. Задачи данного типа являются задачами взаимодействия с пользователем. Очередь с данным QOS ориентирована на оперативность и производительность.

Выполнение задачи происходит практически мгновенно, через несколько секунд или меньше.

Пример — открытие файла, начало проигрывания видео или музыки.

Utility Задачи, которые могут занять некоторое время до собственного окончания и не требует немедленного результата, например, загрузка или импорта данных. Такие задачи, как правило, имеют индикатор, который виден пользователю. Очередь с данным QOS ориентирована на обеспечение баланса между  производительностью и эффективностью использования энергии.

Выполнение задачи происходит от нескольких секунд до нескольких минут.

Пример — загрузка картинки с удаленного сервера, обновление данных в базе данных.

Background Задачи, которые работают в фоновом режиме и не видны пользователю, например, индексация, синхронизация или резервное копирование. Очередь с данным QOS ориентирована на эффективность использования энергии.

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

Пример — открытие файла, начало проигрывания видео или музыки.

Получить очереди можно используя меттоды

//
// proSwift.ru
//

let queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)

let mainQueue = dispatch_get_main_queue() // Для получения основной очереди используется укороченный метод

Можно создать свою очередь.

Для этого нужно определить атрибуты, в которых указать QOS и тип очереди.

//
// proSwift.ru
//

let attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, 0)
let primeQueue = dispatch_queue_create("ru.swift.primer", attr)

А затем создать очередь, указав имя и атрибуты. Имя очереди нужно задавать обязательно, в будущем это сильно упростит момент отладки приложения.

Добавление задач в очереди

Добавить задачу в очередь можно с помощью методов

//
// proSwift.ru
//

public func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
public func dispatch_sync(queue: dispatch_queue_t, _ block: dispatch_block_t)

которые состоят из указания очереди и замыкания. Замыкание — это и есть задача, которую мы отправляем на выполнение в очередь. Отличие методов весьма существенное, несмотря на незначительную разницу в синтаксисе.

dispatch_async — немедленно вернет значение функции, а задача будет выполнена когда-то в будущем, в той очереди в которую вы ее поставили.

dispatch_sync — вернет значение функции только после того как задача будет выполнена.

Добавление через dispatch_sync НЕ ОЗНАЧАЕТ ЧТО ЗАДАЧА БУДЕТ ВЫПОЛНЕНА НЕМЕДЛЕННО! Она будет добавлена в очередь и выполнена лишь тогда, когда система сочтет нужным ее выполнить. Соответственно можно получить заморозку основного потока, пока выполняется подобная задача.

Добавить комментарий

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.