У меня есть много кода в проектах Swift 2.x (или даже 1.x), который выглядит следующим образом:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
Или что-то вроде этого, чтобы задержать выполнение:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
Или любое другое использование API Grand Central Dispatch ...
Теперь, когда я открыл свой проект в Xcode 8 (бета) для Swift 3, я получаю всевозможные ошибки. Некоторые из них предлагают исправить мой код, но не все исправления создают рабочий код. Что мне делать с этим?
Ответы:
С самого начала Swift предоставил некоторые возможности для того, чтобы сделать ObjC и C более Swifty, добавляя больше с каждой версией. Теперь в Swift 3 новая функция «импортировать как член» позволяет интегрированным средам с определенными стилями C API - где у вас есть тип данных, который работает как класс, и набор глобальных функций для работы с ним - действовать больше как Swift-нативные API. Типы данных импортируются как классы Swift, связанные с ними глобальные функции импортируются как методы и свойства этих классов, и некоторые связанные вещи, такие как наборы констант, могут стать подходящими подтипами.
В бета-версии Xcode 8 / Swift 3 Apple применила эту функцию (наряду с несколькими другими), чтобы сделать среду Dispatch намного более быстрой. (И Core Graphics тоже.) Если вы следили за усилиями Swift с открытым исходным кодом, это не новость , но теперь это первый раз, когда он является частью Xcode.
Ваш первый шаг по перемещению любого проекта в Swift 3 должен состоять в том, чтобы открыть его в Xcode 8 и выбрать Edit> Convert> To Current Swift Syntax ... в меню. Это применимо (с вашим рассмотрением и одобрением) ко всем изменениям, необходимым сразу для всех переименованных API и других изменений. (Зачастую строка кода затрагивается более чем одним из этих изменений одновременно, поэтому реагирование на исправление ошибки может привести к неправильной обработке в отдельности.)
В результате общий шаблон для отскока работы от фона и обратно теперь выглядит так:
Обратите внимание, что мы используем
.userInitiated
вместо одной из старыхDISPATCH_QUEUE_PRIORITY
констант. Спецификаторы качества обслуживания (QoS) были введены в OS X 10.10 / iOS 8.0, предоставляя более ясный способ для системы расставить приоритеты в работе и исключить старые спецификаторы приоритетов. Подробности смотрите в документации Apple по фоновой работе и энергоэффективности .Кстати, если вы держать свои собственные очереди , чтобы организовать работу, так , чтобы получить один теперь выглядит следующим образом (обратите внимание , что
DispatchQueueAttributes
являетсяOptionSet
, поэтому можно использовать литералы коллекции в стиле комбинировать варианты):Используете,
dispatch_after
чтобы сделать работу позже? Это также метод для очередей, и он требуетDispatchTime
, который имеет операторы для различных числовых типов, так что вы можете просто добавить целые или дробные секунды:Вы можете обойти новый Диспетчерский API, открыв его интерфейс в Xcode 8 - используйте Open Quickly, чтобы найти модуль Dispatch, или поместите символ (например
DispatchQueue
) в ваш проект / игровую площадку Swift и щелкните по нему командой, а затем бегите вокруг модуль оттуда. (Вы можете найти Swift Dispatch API на изящном новом Справочном веб-сайте API Reference и in-Xcode doc viewer, но похоже, что содержимое документа из версии C пока еще не перемещено в него.)См. Руководство по миграции для получения дополнительных советов.
источник
qos:
вместоattributes:
myQueue.async {
вclass Foo
примере?В Xcode 8 beta 4 не работает ...
Использование:
для асинхронности два пути:
источник
Это один хороший пример
Swift 4
оasync
:источник
в Xcode 8 используйте:
источник
Swift 5.2, 4 и позже
Основные и фоновые очереди
Работа с асинхронными и синхронизирующими потоками!
Асинхронные потоки будут работать вместе с основным потоком.
Синхронизация потоков будет блокировать основной поток во время выполнения.
источник
Swift 4.1 и 5. Мы используем очереди во многих местах нашего кода. Итак, я создал класс Threads со всеми очередями. Если вы не хотите использовать класс Threads, вы можете скопировать нужный код очереди из методов класса.
Пример, показывающий использование основной очереди.
источник