web-dev-qa-db-ja.com

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()が呼び出されると

29
Jeef

UIKitはスレッドセーフではありません。 UIはメインスレッドからのみ更新する必要があります。

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

更新。 In Swift 3以降で使用:

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

このようにUITableViewをリロードすることもできます

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

With Swift 3 use

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

スウィフト3:

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

NSOperationQueue.mainQueue()を使用してメインスレッドを更新することもできます。マルチスレッドの場合、NSOperationQueueは優れたツールです。

書き方の1つ:

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

UpdateDispatchQueueがこの方法です

1
bubbaspike