Multithreading в Swift — приемы и примеры. Grand Central Dispatch (GCD)

Мультизадачность в iOS  реализована C-библиотекой Grand Central Dispatch (GCD). Это очень удобный инструмент, который за сценой самостоятельно реализует работу, и  разработчику не надо с этим заморачиваться. Разработчик не создает потоки, он оперирует с понятиями «Queue»  — очередь. Т.е. разработчик ставит в очередь (queue) функцию (обычно это замыкание), указывает приоритет для этой задачи, и GCD ее выполняет.

Main Queue

Это специальная очередь в GCD, в которой и только в которой нужно выполнять всю активность пользовательского интерфейса.  Main Queue — это serial queue, т.е. задачи в ней выполняются последовательно (одна за другой), и одна в единицу времени

Как получить Main Queue

let mainQ: dispatch_queue_t = dispatch_get_main_queue()
let mainQ: NSOperationQueue = NSOperationQueue.mainQueue() 

dispatch_async(notTheMainQueue) {
// делаем что-то что блокирует поток 
      dispatch_async(dispatch_get_main_queue()) {
// вызываем функции UI, которые работают с результатами, полученными выше
      }
}

Другие очереди

Другие очереди — это concurrent queue, т.е. задачи выполняются параллельно. Эти очереди гарантирует только то, что задачи в них будут запущены по очереди добавления их очередь (queue). А вот время выполнения задачи будет зависеть только от самой задачи. Они запрашиваются у системы при помощи констант quality of service

//
// proSwift.ru
//

QOS_CLASS_USER_INTERACTIVE // для задач быстрых и с высоким приоритетом
QOS_CLASS_USER_INITIATED // для задач с высоким приоритетом, но которые могут занять время
QOS_CLASS_UTILITY // для продолжительных задач
QOS_CLASS_BACKGROUND // для задач, выполняемых в background

let qos = Int(<Ондна из констант>.rawValue) // Swift 2. Для Swift ранних версий следует использовать .value
let queue = dispatch_get_global_queue(qos, 0) // получили concurrent queue

Итак общий процесс работы выглядит следующим образом:

//
// proSwift.ru
//

let queue: dispatch_queue_t = ...//получили очередь, которая нам нужна в данный момент 
dispatch_async(queue) { //в замыкании запустили то что нам нужно запустить в полученной очереди }

Создать свою serial queue:

//
// proSwift.ru
//

let serialQ = dispatch_queue_create(“name”, DISPATCH_QUEUE_SERIAL)

Другие примеры использования читайте в следующей статье

Метки: ,

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

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