Depuis le début, Swift a fourni quelques fonctionnalités pour rendre ObjC et C plus Swifty, en ajoutant plus avec chaque version. Maintenant, dans Swift 3, la nouvelle fonctionnalité "importer en tant que membre" permet aux frameworks avec certains styles d'API C - où vous avez un type de données qui fonctionne un peu comme une classe, et un tas de fonctions globales pour travailler avec - agissent plus comme des API natives de Swift. Les types de données sont importés en tant que classes Swift, leurs fonctions globales associées sont importées en tant que méthodes et propriétés sur ces classes, et certaines choses connexes comme des ensembles de constantes peuvent devenir des sous-types, le cas échéant.
Dans Xcode 8 / Swift 3 beta, Apple a appliqué cette fonctionnalité (avec quelques autres) pour rendre le framework Dispatch beaucoup plus Swifty. (Et Core Graphics aussi.) Si vous avez suivi les efforts open source de Swift, ce n'est pas une nouveauté , mais c'est maintenant la première fois qu'il fait partie de Xcode.
La première étape pour déplacer un projet vers Swift 3 devrait être de l'ouvrir dans Xcode 8 et de choisir Édition> Convertir> En syntaxe Swift actuelle ... dans le menu. Cela s'appliquera (avec votre examen et votre approbation) à toutes les modifications nécessaires à la fois pour toutes les API renommées et autres modifications. (Souvent, une ligne de code est affectée par plusieurs de ces modifications à la fois, donc répondre individuellement aux correctifs d'erreur peut ne pas tout gérer correctement.)
Le résultat est que le modèle courant de rebond du travail à l'arrière-plan et à l'arrière ressemble maintenant à ceci:
// 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
}
}
Notez que nous utilisons à la .userInitiated
place de l'une des anciennes DISPATCH_QUEUE_PRIORITY
constantes. Des spécificateurs de qualité de service (QoS) ont été introduits dans OS X 10.10 / iOS 8.0, fournissant un moyen plus clair pour le système de prioriser le travail et de déprécier les anciens spécificateurs de priorité. Consultez les documents d'Apple sur les travaux en arrière-plan et l'efficacité énergétique pour plus de détails.
Soit dit en passant, si vous conservez vos propres files d'attente pour organiser le travail, la façon d'en obtenir une ressemble maintenant à ceci (notez que DispatchQueueAttributes
c'est un OptionSet
, donc vous utilisez des littéraux de style collection pour combiner les options):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Vous dispatch_after
utilisez pour travailler plus tard? C'est aussi une méthode sur les files d'attente, et elle prend un DispatchTime
, qui a des opérateurs pour différents types numériques afin que vous puissiez simplement ajouter des secondes entières ou fractionnaires:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Vous pouvez trouver votre chemin dans la nouvelle API Dispatch en ouvrant son interface dans Xcode 8 - utilisez Ouvrir rapidement pour trouver le module Dispatch, ou mettez un symbole (comme DispatchQueue
) dans votre projet / terrain de jeu Swift et cliquez dessus avec le bouton de commande, puis faites le tour le module à partir de là. (Vous pouvez trouver l' API Swift Dispatch dans le nouveau site Web de référence d'API et la visionneuse de documents in-Xcode d'Apple, mais il semble que le contenu du document de la version C n'y soit pas encore entré.)
Consultez le Guide de migration pour plus de conseils.