Od samego początku Swift zapewnił pewne możliwości zwiększania Swifty w ObjC i C, dodając więcej z każdą wersją. Teraz, w Swift 3, nowa funkcja „importuj jako członka” pozwala frameworkom z niektórymi stylami C API - gdzie masz typ danych, który działa trochę jak klasa, i kilka globalnych funkcji do pracy z nim - działają bardziej jak natywne interfejsy API Swift. Typy danych są importowane jako klasy Swift, powiązane z nimi funkcje globalne są importowane jako metody i właściwości tych klas, a niektóre powiązane rzeczy, takie jak zestawy stałych, mogą w stosownych przypadkach stać się podtypami.
W Xcode 8 / Swift 3 beta Apple zastosował tę funkcję (wraz z kilkoma innymi), aby uczynić środowisko Dispatch znacznie bardziej Swifty. (A także Core Graphics .) Jeśli śledziłeś działania Swift typu open source, to nie jest nowość , ale teraz jest to pierwsza część Xcode.
Pierwszym krokiem na przeniesienie dowolnego projektu Swift 3 powinno być, aby otworzyć go w Xcode 8 i wybierz Edycja> Przekształć> do aktualnych Swift Składnia ... w menu. Dotyczy to (po sprawdzeniu i zatwierdzeniu) wszystkich zmian na raz wymaganych dla wszystkich przemianowanych interfejsów API i innych zmian. (Często na wiersz kodu wpływa więcej niż jedna z tych zmian naraz, więc reagowanie na naprawę błędu - jego osobno może nie wszystko poprawnie obsłużyć).
W rezultacie wspólny wzór odskakiwania do pracy w tle i wstecz wygląda teraz następująco:
// 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
}
}
Uwaga: używamy .userInitiated
zamiast jednej ze starych DISPATCH_QUEUE_PRIORITY
stałych. Specyfikatory jakości usług (QoS) zostały wprowadzone w OS X 10.10 / iOS 8.0, zapewniając systemowi wyraźniejszy sposób ustalania priorytetów pracy i nieaktualne stare specyfikatory priorytetów. Szczegółowe informacje można znaleźć w dokumentach Apple na temat pracy w tle i efektywności energetycznej .
Nawiasem mówiąc, jeśli trzymasz własne kolejki do organizowania pracy, sposób na uzyskanie kolejki wygląda teraz tak (zauważ, że DispatchQueueAttributes
to OptionSet
, więc używasz literałów w stylu kolekcji do łączenia opcji):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Używasz dispatch_after
do pracy później? To także metoda kolejek, która wymaga DispatchTime
operatora, który ma operatory dla różnych typów liczbowych, dzięki czemu można po prostu dodać całe lub ułamkowe sekundy:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Możesz obejść nowy interfejs API Dispatch, otwierając jego interfejs w Xcode 8 - użyj Otwórz szybko, aby znaleźć moduł Dispatch lub umieść symbol (podobny DispatchQueue
) w swoim projekcie / placu zabaw Swift i kliknij go, a następnie przeciągnij się moduł stamtąd. ( Interfejs API Swift Dispatch można znaleźć w nowej, zwięzłej witrynie Apple Reference API i przeglądarce dokumentów w Xcode, ale wygląda na to, że zawartość dokumentów z wersji C jeszcze się do niej nie przeniesiła.)
Więcej porad znajdziesz w Przewodniku migracji .