web-dev-qa-db-fra.com

Swift UITableView reloadData dans une fermeture

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

27
Jeef

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

Vous pouvez aussi recharger UITableView comme ceci

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

Swift 3: 

OperationQueue.main.addOperation ({
     self.tableView.reloadData()
})
1
Maksim Kniazev

Avec Swift 3, utilisez 

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

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

Update: DispatchQueue est la voie à suivre pour cela

1
bubbaspike