No meu aplicativo, tenho uma função que cria uma NSRURLSession e envia uma NSURLRequest usando
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
No bloco de conclusão desta tarefa, preciso fazer alguns cálculos que adicionem uma UIImage ao viewcontroller de chamada. Eu tenho uma função chamada
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
que faz o cálculo de adição de UIImage. Se eu tentar executar o código de adição de exibição dentro do bloco de conclusão, o Xcode emitirá um erro dizendo que não posso usar o mecanismo de layout enquanto estiver em um processo em segundo plano. Então, eu encontrei algum código no SO que tenta enfileirar um método no thread principal:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
No entanto, não sei como adicionar os parâmetros "receiveAddr" e "amountBTC" a essa chamada de função. Como eu faria isso, ou alguém pode sugerir uma maneira ideal de adicionar uma chamada de método à fila principal do aplicativo?
fonte
Versão Swift 3+ e Swift 4:
Swift 3 e Xcode 9.2:
fonte
Swift 2
Usando Trailing Closures, isso se torna:
Trailing Closures é o açúcar sintático Swift que permite definir o fechamento fora do escopo do parâmetro da função. Para obter mais informações, consulte Trailing Closures no Swift 2.2 Programming Language Guide.
No caso dispatch_async, a API é
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
uma vez quedispatch_block_t
é do tipo alias para() -> Void
- Um fechamento que recebe 0 parâmetros e não possui um valor de retorno, e bloco sendo o último parâmetro da função, podemos definir o fechamento no escopo externo dedispatch_async
.fonte
Recarregar coleçãoView on Main Thread
fonte
Aqui está a melhor sintaxe do estilo Swifty / Cocoa (IMO) para obter o mesmo resultado que as outras respostas:
Ou você pode pegar a popular biblioteca Async Swift para obter ainda menos código e mais funcionalidades:
fonte
OperationQueue.main.addOperation({ }
A maneira correta de fazer isso é usar dispatch_async no main_queue, como fiz no código a seguir
fonte
Aqui está uma pequena função global que você pode adicionar para obter uma sintaxe melhor:
E uso
fonte
fonte
Não se esqueça de enfraquecer a si mesmo se você estiver usando a si mesma dentro do fechamento.
fonte