Je pense avoir un problème où ma fermeture se produit sur un thread en arrière-plan et mon UITableView ne se met pas à jour assez rapidement. Je passe un appel à un service REST et dans ma fermeture, j’ai un appel tableView.reloadData()
, mais cela prend quelques secondes pour que cela se produise. Comment puis-je accélérer le rechargement des données (peut-être sur le thread principal?)
Fonction de requête REST - utilisation de la bibliothèque SwiftyJSON pour le décodage
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()
})
}
Une fois que self.tableView.reloadData()
est appelé dans mon débogueur
UIKit n'est pas thread-safe. L'interface utilisateur doit uniquement être mise à jour à partir du fil principal:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
Mettre à jour . Dans Swift 3 et versions ultérieures, utilisez:
DispatchQueue.main.async {
self.tableView.reloadData()
}
Vous pouvez aussi recharger UITableView comme ceci
self.tblMainTable.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)
Swift 3:
OperationQueue.main.addOperation ({
self.tableView.reloadData()
})
Avec Swift 3, utilisez
DispatchQueue.main.async {
self.tableView.reloadData()
}
Vous pouvez également mettre à jour le thread principal à l'aide de NSOperationQueue.mainQueue()
. NSOperationQueue est un excellent outil pour le multithreading.
Une façon dont cela pourrait être écrit:
NSOperationQueue.mainQueue().addOperationWithBlock({
self.tableView.reloadData()
})