пятница, 7 августа 2015 г.

Background Threads

И так, начнем с простого. Мы ставим перед собой задачу: перемещаться "в" и "из" фоновый поток.
И сразу натыкаемся на легкий случай - синтаксис не слишком отличается от Objective-C. В первом приближении это выглядит так:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 // do some task
 dispatch_async(dispatch_get_main_queue(), ^{
  // update some UI
 });
});
Единственное заметное отличие - то, что код на Swift может использовать замыкания за пределами параметров функции (ориг.: trailing closures), исключая необходимость в закрытии родительских скобок в конце:
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
 // do some task
 dispatch_async(dispatch_get_main_queue()) {
  // update some UI
 }
}


Совет: Для того чтобы сказать, в какой потоке выполняется конкретный кусок кода (в главном или нет), добавьте следующий код:
println("On the main thread? " + (NSThread.currentThread().isMainThread ? "Yes" : "No"))

Если используя Swift,  вы часто сталкиваетесь со следующей ситуацией: вы делаете что-то в фоне и по окончанию работы в фоновом потоке вам нужно что-то выполнить в главном потоке (например обновить UI или tableView.reloadData() и т.д. ), то вам может пригодиться умный оператор от Josh Smith:
{ /* do some task */ } ~> { /* update some UI */}
Вот демонстрация





















Более полная демонстрация возможностей для оператора ~> здесь .

Оригинал: https://thatthinginswift.com/background-threads/

Комментариев нет:

Отправить комментарий