2014-10-09 5 views
18

Я считаю, что у меня проблема, когда мое закрытие происходит в фоновом потоке, и мой UITableView не обновляется достаточно быстро. Я звоню в службу REST, и в моем закрытии у меня есть звонок tableView.reloadData(), но для этого требуется несколько секунд. Как сделать данные перезарядить быстрееSwift UITableView reloadData в закрытии

REST Query Function (возможно, в главном потоке?) - с использованием библиотеки 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() вызывается в моем отладчик

ответ

46

UIKit не является потокобезопасным. Пользовательский интерфейс должен быть обновлен только из основного потока:

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

Update. В Swift 3 и последующего использования:

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

Правильный код должен быть: dispatch_async (dispatch_get_main_queue(), {self.tableView.reloadData()}) – Jeef

+0

Простите, исправлено. – Kirsteins

+0

Не будем ли мы использовать [слабое я] вместо себя, чтобы избежать циклов сохранения? –

3

Вы также можете перезагрузить UITableView как этот

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

Спасенный день бутон. Благодарю. –

+0

где эта функция должна быть поставлена? in viewdidload? –

0

Вы также можете обновить основную нить с помощью NSOperationQueue.mainQueue(). Для многопоточности NSOperationQueue - отличный инструмент.

Одним из способов может быть написано:

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

Update: DispatchQueue is the way to go for this

1

С Swift 3 использования

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

будет ли это замораживать интерфейс? –

+0

Нет, это не заморозит пользовательский интерфейс. – Sal

0

СВИФТ 3:

OperationQueue.main.addOperation ({ 
    self.tableView.reloadData() 
}) 
Смежные вопросы