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()
})