2014-10-09 11 views
18

Wierzę, że mam problem, w którym moje zamknięcie dzieje się w wątku tła i mój UITableView nie aktualizuje się wystarczająco szybko. Dzwonię do usługi REST iw moim zamknięciu mam wywołanie tableView.reloadData(), ale to zajmie kilka sekund. Jak wykonać dane przeładować szybciejSwift UITableView reloadData w zamknięciu

REST Query Function (być może w głównym wątku?) - za pomocą SwiftyJSON bibliotekę do dekodowania

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


    }) 
} 

Po self.tableView.reloadData() nazywa w moim debugera

Odpowiedz

46

UIKit nie jest bezpieczna dla wątków. UI powinny być aktualizowane tylko od głównego wątku:

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

Aktualizacja. W Swift 3 i późniejszego użytku:

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

Prawidłowy kod powinien być: dispatch_async (dispatch_get_main_queue(), {self.tableView.reloadData()}) – Jeef

+0

Przepraszam za to, naprawiony. – Kirsteins

+0

Czy nie powinniśmy używać [słabego ja] zamiast siebie, aby uniknąć cykli zachowania? –

3

Można również przeładować UITableView jak ten

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

Uratowałem mój dzień bud. Dzięki. –

+0

gdzie powinna się znaleźć ta funkcja? w viewdidload? –

0

Można również aktualizować główny wątek korzystając NSOperationQueue.mainQueue(). W przypadku wielowątkowości, NSOperationQueue jest doskonałym narzędziem.

Jednym ze sposobów mogłoby być napisane:

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

Aktualizacja: DispatchQueue is the way to go for this

1

Z Swift 3 Użyj

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

Czy to zablokuje interfejs użytkownika? –

+0

Nie, to nie blokuje interfejsu użytkownika. – Sal

0

SWIFT 3:

OperationQueue.main.addOperation ({ 
    self.tableView.reloadData() 
}) 
Powiązane problemy