Swift UITableView reloadData в закрытии

Я считаю, что у меня проблема, когда мое закрытие происходит в фоновом потоке, и мой UITableView не обновляется достаточно быстро. Я звоню в службу REST, и в моем закрытии у меня есть вызов tableView.reloadData(), но для этого требуется несколько секунд. Как ускорить загрузку данных (возможно, в основном потоке?)

Функция запроса REST - использование библиотеки SwiftyJSON для декодирования

func asyncFlightsQuery() {
    var url : String = "http://127.0.0.1:5000/flights"
    var request : NSMutableURLRequest = NSMutableURLRequest()
    request.URL = NSURL(string: url)
    request.HTTPMethod = "GET"

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, networkData: NSData!, error: NSError!) -> Void in
        var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil


        // Parse with SwiftyJSON
        let json = JSON(data: networkData)

        // Empty out Results array
        self.resultArray = []

        // Populate Results Array
        for (key: String, subJson: JSON) in json["flights"] {
            print ("KEY: \(key) ")
            print (subJson["flightId"])
            print ("\n")

            self.resultArray.append(subJson)
        }

        print ("Calling reloadData on table..??")
        self.tableView.reloadData()


    })
}

Как только self.tableView.reloadData() вызывается в моем отладчике

Ответы

Ответ 1

UIKit не является потокобезопасным. Пользовательский интерфейс должен обновляться только из основного потока:

dispatch_async(dispatch_get_main_queue()) {
    self.tableView.reloadData()
}

Обновление. В Swift 3 и более поздних версиях используйте:

DispatchQueue.main.async {
    self.tableView.reloadData()
}

Ответ 2

Вы также можете перезагрузить UITableView следующим образом

self.tblMainTable.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)

Ответ 3

С Swift 3 используйте

DispatchQueue.main.async {
    self.tableView.reloadData()
}

Ответ 4

Вы также можете обновить основной поток, используя NSOperationQueue.mainQueue(). Для многопоточности NSOperationQueue - отличный инструмент.

Один из способов:

NSOperationQueue.mainQueue().addOperationWithBlock({
     self.tableView.reloadData()       
})

Обновить: DispatchQueue - путь для этого

Ответ 5

SWIFT 3:

OperationQueue.main.addOperation ({
     self.tableView.reloadData()
})