Ответ 1
Или вы также можете использовать очереди операций. В Swift 3:
let queue = OperationQueue()
queue.addOperation() {
// do something in the background
OperationQueue.main.addOperation() {
// when done, update your UI and/or model on the main queue
}
}
Либо это, либо GCD, который иллюстрировал Энди, работают нормально.
См. Apple Руководство по программированию параллелизма для ознакомления с относительными достоинствами очередей операций и очередей отправки (также известной как Grand Central Dispatch, GCD). Хотя это руководство по-прежнему иллюстрирует примеры с использованием Objective-C, API и концепции в Swift практически одинаковы (просто используйте синтаксис Swift). Документация для GCD и очередей операций в Xcode описывает API Objective-C и Swift.
Кстати, вы заметите, что как в приведенном выше примере, так и в демонстрации Энди GCD мы использовали "замыкающие замыкания". Например, если вы посмотрите на определение addOperationWithBlock
, оно определено как функция с одним параметром, который является "замыканием" (которое аналогично блоку в Objective-C):
func addOperation(_ block: @escaping () -> Swift.Void)
Это может привести к предположению, что вы будете вызывать его следующим образом:
queue.addOperation({
// do something in the background
})
Но когда последним параметром функции является замыкание, синтаксис конечного замыкания позволяет вам взять этот заключительный параметр замыкания из скобок функции и переместить его после функции, получив:
queue.addOperation() {
// do something in the background
}
А поскольку в скобках ничего не осталось, вы можете пойти еще дальше и удалить эти пустые скобки:
queue.addOperation {
// do something in the background
}
Надеюсь, это иллюстрирует, как интерпретировать объявления функций NSOperationQueue
/OperationQueue
и/или GCD и использовать их в вашем коде.