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)
Другие примеры использования читайте в следующей статье
Добавить комментарий