Sin dall'inizio, Swift ha fornito alcune strutture per rendere ObjC e C più Swifty, aggiungendo di più ad ogni versione. Ora, in Swift 3, la nuova funzione "importa come membro" consente ai framework con determinati stili di API C - in cui hai un tipo di dati che funziona in qualche modo come una classe e un sacco di funzioni globali con cui lavorare - agire più come API native di Swift. I tipi di dati vengono importati come classi Swift, le loro funzioni globali correlate vengono importate come metodi e proprietà su tali classi e alcune cose correlate come insiemi di costanti possono diventare sottotipi ove appropriato.
In Xcode 8 / Swift 3 beta, Apple ha applicato questa funzione (insieme ad alcune altre) per rendere il framework Dispatch molto più Swifty. (E anche Core Graphics .) Se hai seguito gli sforzi open source di Swift, questa non è una novità , ma ora è la prima volta che fa parte di Xcode.
Il primo passo per spostare qualsiasi progetto su Swift 3 dovrebbe essere quello di aprirlo in Xcode 8 e scegliere Modifica> Converti> In sintassi Swift corrente ... nel menu. Ciò applicherà (con la tua recensione e approvazione) tutte le modifiche necessarie per tutte le API rinominate e altre modifiche. (Spesso, una riga di codice è influenzata da più di una di queste modifiche contemporaneamente, quindi rispondendo alla correzione di errori, è possibile che individualmente non gestisca tutto correttamente.)
Il risultato è che il modello comune per far rimbalzare il lavoro sullo sfondo e viceversa ora appare così:
// 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
}
}
Nota che stiamo usando al .userInitiated
posto di una delle vecchie DISPATCH_QUEUE_PRIORITY
costanti. Gli identificatori di qualità del servizio (QoS) sono stati introdotti in OS X 10.10 / iOS 8.0, fornendo un modo più chiaro per il sistema di stabilire le priorità del lavoro e deprecare i vecchi identificatori di priorità. Consulta i documenti di Apple sul lavoro in background e l'efficienza energetica per i dettagli.
A proposito, se stai mantenendo le tue code per organizzare il lavoro, il modo per ottenerne uno ora appare così (nota che DispatchQueueAttributes
è un OptionSet
, quindi usi letterali in stile raccolta per combinare le opzioni):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Stai usando dispatch_after
per lavorare più tardi? Questo è anche un metodo per le code e richiede un DispatchTime
, che ha operatori per vari tipi numerici in modo da poter aggiungere solo secondi interi o frazionari:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Puoi orientarti nella nuova API di Dispatch aprendo la sua interfaccia in Xcode 8 - usa Open Quickly per trovare il modulo Dispatch, oppure metti un simbolo (come DispatchQueue
) nel tuo progetto / parco giochi Swift e fai clic su di esso, quindi fai un giro il modulo da lì. (Puoi trovare l' API Swift Dispatch nel nuovo sito Web di riferimento API di Apple e nel visualizzatore di documenti in-Xcode, ma sembra che il contenuto del documento della versione C non sia ancora stato spostato in esso.)
Consulta la Guida alla migrazione per ulteriori suggerimenti.