С самого начала 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 и других изменений. (Зачастую строка кода затрагивается более чем одним из этих изменений одновременно, поэтому реагирование на исправление ошибки может привести к неправильной обработке в отдельности.)
В результате общий шаблон для отскока работы от фона и обратно теперь выглядит так:
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.imageView.image = image
}
}
Обратите внимание, что мы используем .userInitiated
вместо одной из старых DISPATCH_QUEUE_PRIORITY
констант. Спецификаторы качества обслуживания (QoS) были введены в OS X 10.10 / iOS 8.0, предоставляя более ясный способ для системы расставить приоритеты в работе и исключить старые спецификаторы приоритетов. Подробности смотрите в документации Apple по фоновой работе и энергоэффективности .
Кстати, если вы держать свои собственные очереди , чтобы организовать работу, так , чтобы получить один теперь выглядит следующим образом (обратите внимание , что DispatchQueueAttributes
является OptionSet
, поэтому можно использовать литералы коллекции в стиле комбинировать варианты):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Используете, dispatch_after
чтобы сделать работу позже? Это также метод для очередей, и он требует DispatchTime
, который имеет операторы для различных числовых типов, так что вы можете просто добавить целые или дробные секунды:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Вы можете обойти новый Диспетчерский API, открыв его интерфейс в Xcode 8 - используйте Open Quickly, чтобы найти модуль Dispatch, или поместите символ (например DispatchQueue
) в ваш проект / игровую площадку Swift и щелкните по нему командой, а затем бегите вокруг модуль оттуда. (Вы можете найти Swift Dispatch API на изящном новом Справочном веб-сайте API Reference и in-Xcode doc viewer, но похоже, что содержимое документа из версии C пока еще не перемещено в него.)
См. Руководство по миграции для получения дополнительных советов.