Swift 2 - Algo Similar a AsyncTask no Android

Bom dia pessoal,

Sou desenvolvedor Android e estou aprendendo Swfit, porem estou com uma duvida, vou fazer uma chamada para o meu servidor e ele vai retornar um JSON, ate ai esta funcionando tudo perfeito! Porem queria fazer isso em uma outra thread e deixar um loading carregando enquanto essa acao durar…

Andei pesquisando e achei algo relacionado a blocks, porem nao consegui implementar com sucesso (nao consegui deixar em uma segunda thread)

Alguem tem alguma dica, ou alguem exemplo?

Criei um exemplo para tentar adicionar o loading:

showProgress("oi")
hardProcessingWithString("", completion: completion)
func hardProcessingWithString(input: String, completion: (result: String) -> Void) {
    completion(result: "we finished!")
}

func completion(name: String) {
    var i = 1
    while i <= 90000 {
        print(i)
        i = i + 1
    }
}

Valeu :slight_smile:

Em Swift, se você quer executar um bloco de código em uma thread diferente você deverá usar o que chamamos de Grand Central Dispatch. Um exemplo:

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
...
}

Você não deverá atualizar a parte de UI em alguma thread que não seja a main. Para executar um código na main você pode usar:

dispatch_async(dispatch_get_main_queue(), {
.... código
}

Se você precisa receber o resultado do servidor recomendo usar o framework AFNetworking ou Alamofire, eles já te devolvem o JSON em uma chamada de block, ou seja, você não precisa se preocupar com isso, apenas mostra o loading antes da chamada e esconde ele dentro do block de completion. Exemplo:

showLoadingHUD()         
//Usando AFNetworking
APIManager.sharedInstance.validateService(test, succeeded: { results -> Void in
        //Chamado ao fim da solicitação no servidor
        self.hideLoadingHUD()
})

Opa, consegui aqui!

Vou utilizar Alamofire, achei bem simples de implementar e controlar tudo que eu preciso.

Valeu pela resposta :slight_smile:

Desde o iOS 7 existe o NSURLSession que já faz tudo isso. Não precisa usar framework nenhum.