И так, начнем с простого. Мы ставим перед собой задачу: перемещаться "в" и "из" фоновый поток.
И сразу натыкаемся на легкий случай - синтаксис не слишком отличается от Objective-C. В первом приближении это выглядит так:
Единственное заметное отличие - то, что код на Swift может использовать
замыкания за пределами параметров функции (ориг.: trailing closures), исключая необходимость в закрытии родительских скобок в конце:
Если используя Swift, вы часто сталкиваетесь со следующей ситуацией: вы делаете что-то в фоне и по окончанию работы в фоновом потоке вам нужно что-то выполнить в главном потоке (например обновить UI или tableView.reloadData() и т.д. ), то вам может пригодиться умный оператор от Josh Smith:
Вот демонстрация
Более полная демонстрация возможностей для оператора ~> здесь .
Оригинал: https://thatthinginswift.com/background-threads/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do some task
dispatch_async(dispatch_get_main_queue(), ^{
// update some UI
});
});
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"))

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/
Комментариев нет:
Отправить комментарий