Desde o início, o Swift forneceu algumas facilidades para tornar ObjC e C mais Swifty, adicionando mais a cada versão. Agora, no Swift 3, o novo recurso "importar como membro" permite estruturas com certos estilos de API C - onde você tem um tipo de dados que funciona como uma classe e várias funções globais para trabalhar com ele - agem mais como APIs nativas do Swift. Os tipos de dados são importados como classes Swift, suas funções globais relacionadas são importadas como métodos e propriedades nessas classes, e algumas coisas relacionadas, como conjuntos de constantes, podem se tornar subtipos, quando apropriado.
No Xcode 8 / Swift 3 beta, a Apple aplicou esse recurso (junto com alguns outros) para tornar a estrutura do Dispatch muito mais Swifty. (E gráficos básicos também.) Se você tem acompanhado os esforços de código aberto Swift, isso não é novidade , mas agora é a primeira vez que faz parte do Xcode.
Seu primeiro passo na transferência de qualquer projeto para o Swift 3 deve ser aberto no Xcode 8 e escolha Editar> Converter> Para a sintaxe Swift atual ... no menu. Isso aplicará (com sua revisão e aprovação) todas as alterações necessárias de uma só vez para todas as APIs renomeadas e outras alterações. (Geralmente, uma linha de código é afetada por mais de uma dessas alterações ao mesmo tempo, portanto, responder à correção de erros - sua individualmente pode não lidar com tudo certo.)
O resultado é que o padrão comum para devolver o trabalho para segundo plano e para trás agora se parece com o seguinte:
// 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
}
}
Observe que estamos usando, em .userInitiated
vez de uma das DISPATCH_QUEUE_PRIORITY
constantes antigas . Os especificadores de Qualidade de Serviço (QoS) foram introduzidos no OS X 10.10 / iOS 8.0, fornecendo uma maneira mais clara para o sistema priorizar o trabalho e descontinuar os antigos especificadores de prioridade. Consulte os documentos da Apple sobre trabalho em segundo plano e eficiência energética para obter detalhes.
A propósito, se você está mantendo suas próprias filas para organizar o trabalho, a maneira de obter uma agora se parece com isso (observe que DispatchQueueAttributes
é um OptionSet
, então você usa literais no estilo de coleção para combinar opções):
class Foo {
let queue = DispatchQueue(label: "com.example.my-serial-queue",
attributes: [.serial, .qosUtility])
func doStuff() {
queue.async {
print("Hello World")
}
}
}
Usando dispatch_after
para fazer o trabalho mais tarde? Também é um método nas filas e é necessário um DispatchTime
, que possui operadores para vários tipos numéricos, para que você possa adicionar segundos inteiros ou fracionários:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
print("Are we there yet?")
}
Você pode encontrar o caminho da nova API do Dispatch abrindo sua interface no Xcode 8 - use o Open Quickly para encontrar o módulo Dispatch ou coloque um símbolo (como DispatchQueue
) no seu projeto / playground Swift e clique com o comando e, em seguida, clique o módulo de lá. (Você pode encontrar a API do Swift Dispatch no novo site de referência da API da Apple e no visualizador de documentos no Xcode, mas parece que o conteúdo do documento da versão C ainda não foi movido.)
Consulte o Guia de migração para obter mais dicas.