З самого початку Swift надав деякі можливості зробити ObjC та C більш Swifty, додаючи більше з кожною версією. Тепер у Swift 3 нова функція "імпортувати як член" дозволяє створювати рамки з певними стилями API API - де у вас є тип даних, який працює як клас, і купа глобальних функцій для роботи з ним - діють більше, як рідні API Swift. Типи даних імпортуються як класи Swift, пов'язані з ними глобальні функції імпортуються як методи та властивості для цих класів, а деякі пов'язані з ними речі, такі як набори констант, можуть стати підтипами, де це доречно.
У бета-версії Xcode 8 / Swift 3, Apple застосувала цю функцію (разом з кількома іншими), щоб зробити рамку Dispatch набагато швидкішою. (І Core Graphics теж.) Якщо ви дотримувались спроб відкритого джерела Swift, це не новина , але зараз це вперше це частина Xcode.
Першим вашим кроком для переміщення будь-якого проекту до Swift 3 має стати відкриття його в Xcode 8 та виберіть в меню « Правка»> «Перетворити> в поточний синтаксис Swift ... ». Це застосовуватиметься (з оглядом та схваленням) усіх змін, необхідних одразу для всіх перейменованих 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
для виконання роботи пізніше? Це метод і в чергах, і він займає a DispatchTime
, в якому є оператори для різних числових типів, щоб ви могли просто додати цілі або дробові секунди:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Ви можете знайти свій шлях до нового API диспетчеризації, відкривши його інтерфейс у Xcode 8 - скористайтеся функцією "Відкрити швидко", щоб знайти модуль диспетчеризації, або DispatchQueue
введіть символ (як ) у ваш проект / майданчик Swift та клацніть по ньому, а потім перейдіть навколо модуль звідти. (Ви можете знайти API Swift Dispatch на новому веб-сайті Apple, довідковому API API та в програмі перегляду документів в Xcode, але схоже, що вміст doc з версії C ще не перемістився до нього.)
Для отримання порад див. Посібник з міграції .