バックグラウンドスレッドでクロージャが発生し、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()
が呼び出されると
UIKitはスレッドセーフではありません。 UIはメインスレッドからのみ更新する必要があります。
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
更新。 In Swift 3以降で使用:
DispatchQueue.main.async {
self.tableView.reloadData()
}
このようにUITableViewをリロードすることもできます
self.tblMainTable.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)
With Swift 3 use
DispatchQueue.main.async {
self.tableView.reloadData()
}
スウィフト3:
OperationQueue.main.addOperation ({
self.tableView.reloadData()
})
NSOperationQueue.mainQueue()
を使用してメインスレッドを更新することもできます。マルチスレッドの場合、NSOperationQueueは優れたツールです。
書き方の1つ:
NSOperationQueue.mainQueue().addOperationWithBlock({
self.tableView.reloadData()
})
Update: DispatchQueueがこの方法です