Multithreading para iOS - NSURLSession e atualizações da interface do usuário

Tenho uma pergunta geral sobre multithreading no iOS:

No meu aplicativo de teste muito simples, eu uso o NSURLSession para baixar algumas imagens pequenas do servidor e apresentá-las em uma exibição de tabela. No retorno de chamada da NSURLSession, depois de recuperar as imagens, chamo tableview.reloadData () da seguinte forma:

var session = NSURLSession.sharedSession().dataTaskWithURL(NSURL(url)) {(data, response, error) -> Void in
    /* Process images here */
    self.tableView.reloadData()
} session.resume()

As imagens são baixadas quase instantaneamente, masleva de 10 a 20 segundos para a exibição da tabela ser atualizada! Para ser claro, os delegados de atualização nem sequer estão recebendochamado por 10-20 segundos. No entanto, se eu colocar reloadData () no thread principal, ele será atualizado rapidamente. Igual a:

var session = NSURLSession.sharedSession().dataTaskWithURL(NSURL(url)) {(data, response, error) -> Void in
    /* Process images here */
    dispatch_async(dispatch_get_main_queue()) {
        self.tableView.reloadData()
    }
} session.resume()

Então, meu problema está resolvido e posso dormir mais uma vez. Mas alguém pode me explicar por que esse é o caso? Entendo que as atualizações da interface do usuário devem ser executadas no thread principal - então, por que o primeiro caso ainda funciona e ainda é necessário o FOREVER? Não há mais nada acontecendo no aplicativo, então não consigo nem pensar no que poderia estar atrasando a recarga por 20 segundos inteiros. Ele está aguardando o NSURLSession fechar completamente primeiro, ou algo nesse sentido? Encontrando grandes números primos? Mineração de Bitcoin?

Meu conhecimento sobre multithreading é limitado, portanto, qualquer insight sobre essa situação seria extremamente útil para referência futura.

questionAnswers(1)

yourAnswerToTheQuestion