Desde el principio, Swift ha proporcionado algunas facilidades para hacer que ObjC y C sean más Swifty, agregando más con cada versión. Ahora, en Swift 3, la nueva característica "importar como miembro" permite marcos con ciertos estilos de API C, donde tiene un tipo de datos que funciona como una clase y un montón de funciones globales para trabajar con él. actuar más como API nativas de Swift. Los tipos de datos se importan como clases Swift, sus funciones globales relacionadas se importan como métodos y propiedades en esas clases, y algunas cosas relacionadas, como conjuntos de constantes, pueden convertirse en subtipos cuando corresponda.
En Xcode 8 / Swift 3 beta, Apple ha aplicado esta función (junto con algunas otras) para hacer que el marco de Dispatch sea mucho más rápido. (Y Core Graphics , también.) Si ha estado siguiendo los esfuerzos de código abierto de Swift, esto no es noticia , pero ahora es la primera vez que forma parte de Xcode.
El primer paso para mover cualquier proyecto a Swift 3 debe ser abrirlo en Xcode 8 y elegir Edición> Convertir> A sintaxis actual de Swift ... en el menú. Esto aplicará (con su revisión y aprobación) todos los cambios a la vez necesarios para todas las API renombradas y otros cambios. (A menudo, una línea de código se ve afectada por más de uno de estos cambios a la vez, por lo que responder a la corrección de errores, es posible que no pueda manejar todo correctamente).
El resultado es que el patrón común para rebotar el trabajo en segundo plano y viceversa ahora se ve así:
// 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
}
}
Tenga en cuenta que estamos usando en .userInitiated
lugar de una de las DISPATCH_QUEUE_PRIORITY
constantes antiguas . Los especificadores de calidad de servicio (QoS) se introdujeron en OS X 10.10 / iOS 8.0, proporcionando una forma más clara para que el sistema priorice el trabajo y desaproveche los antiguos especificadores de prioridad. Consulte los documentos de Apple sobre trabajo en segundo plano y eficiencia energética para más detalles.
Por cierto, si mantiene sus propias colas para organizar el trabajo, la forma de obtener uno ahora se ve así ( DispatchQueueAttributes
tenga en cuenta que es una OptionSet
, así que usa literales de estilo de colección para combinar opciones):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
¿Utilizando dispatch_after
para hacer el trabajo más tarde? Ese también es un método en colas, y requiere un DispatchTime
, que tiene operadores para varios tipos numéricos, por lo que puede agregar segundos enteros o fraccionarios:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Puede orientarse en la nueva API de Despacho abriendo su interfaz en Xcode 8: use Abrir rápidamente para encontrar el módulo de Despacho, o coloque un símbolo (como DispatchQueue
) en su proyecto / patio de juegos Swift y haga clic con el botón de comando, luego pase alrededor. El módulo desde allí. (Puede encontrar la API Swift Dispatch en el nuevo y sofisticado sitio web de referencia de API de Apple y en el visor de documentos en Xcode, pero parece que el contenido de documentos de la versión C aún no se ha movido).
Consulte la Guía de migración para obtener más consejos.