2015-01-08 8 views
6

Ten pozornie prosty problem doprowadza mnie do szału ... Jestem zabawy z SwiftyJSON chwycić zdalnych danych i tutaj jest to fragment z mojej klasy ViewController w Swift:iOS etykieta nie aktualizuje tekst z funkcji w Swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.statusLabel.text = "welcome" 

    RemoteDataManager.getStatusUpdateFromURL { (statusData) -> Void in 
     let json = JSON(data: statusData) 
     self.statusLabel.text = "this does not work" 
     self.statusLabel.text = self.getMostRecentStatusUpdate(json) // also does not work 
    } 

} 

Tekst statusLabel jest ustawiony na "witamy", ale nie zmienia się później. To zabawne, ale wszystko, co wstawię do urządzenia func getMostRecentStatusUpdate(_:) z println(), zostanie poprawnie wydrukowane na konsoli, nawet jeśli pochodzi ze zdalnego źródła json (tzn. Wiem, że ta funkcja działa). Mój problem polega na tym, że nie mogę wydrukować tekstu na UILabel zamiast na konsoli. Nie dostaję żadnych komunikatów o błędach.

Nie jestem jeszcze zaznajomiony z funkcją Swift, taką jak MyClass.myMethod { (myData) -> Void in .... } i nie rozumiem, co tu jest nie tak. Jakieś pomysły?

+0

Rozumiem ... pytanie jest rzeczywiście takie samo. Moim problemem było to, że Google nie doprowadziło mnie do odpowiedzi, większość odpowiedzi dotyczyła po prostu aktualizacji etykiety tekstowej. Ale można go usunąć, jeśli wolisz. – Pieter

Odpowiedz

22

nie jest bezpieczna dla wątków i powinna być aktualizowana tylko z głównego wątku. Pobieranie odbywa się w wątku w tle i nie można z niego aktualizować interfejsu użytkownika. Wypróbuj:

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.statusLabel.text = "welcome" 

    RemoteDataManager.getStatusUpdateFromURL { (statusData) -> Void in 
     let json = JSON(data: statusData) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.statusLabel.text = "this does not work" 
      self.statusLabel.text = self.getMostRecentStatusUpdate(json) // also does not work 
     } 
    } 
} 
+0

Fantastyczny, działa jak urok! I nauczyłem się czegoś nowego ... dzięki! – Pieter

+4

Używając Swift 3, użyj DispatchQueue.main.async zamiast dispatch_async (dispatch_get_main_queue()) – Peter