Swift UITableView reloadData in a closure

廉价感情. 提交于 2019-12-17 10:53:26

问题


I believe I'm having an issue where my closure is happening on a background thread and my UITableView isn't updating fast enough. I am making a call to a REST service and in my closure i have a tableView.reloadData() call but it takes a few seconds for this to happen. How do I make the data reload faster (perhaps on the main thread?)

REST Query Function - using SwiftyJSON library for Decoding

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


    })
}

Once self.tableView.reloadData() is called in my debugger


回答1:


UIKit isn't thread safe. The UI should only be updated from main thread:

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

Update. In Swift 3 and later use:

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



回答2:


You can also reload UITableView like this

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



回答3:


With Swift 3 use

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



回答4:


SWIFT 3:

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



回答5:


You can also update the main thread using NSOperationQueue.mainQueue(). For multithreading, NSOperationQueue is a great tool.

One way it could be written:

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

Update: DispatchQueue is the way to go for this



来源:https://stackoverflow.com/questions/26277371/swift-uitableview-reloaddata-in-a-closure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!