2014-11-30 16 views
8

Zajmuję się tworzeniem oprogramowania z Xcode 6 przy użyciu Swift. Kiedy naciskam przycisk, mój kod pobiera pewne informacje z sieci i zapisuje je w moim NSWindow.Używanie wątków do aktualizacji interfejsu użytkownika za pomocą Swiftu

więc wyobrazić sobie coś takiego:

@IBAction func buttonPressed(sender: AnyObject) 
{ 
    for page in listOfPages      //Number of pages is 40. 
    { 
     var label: NSTextField = NSTextField(); 

     label.stringValue = getInformetionsFromPage(page) 

     /* 
      some code to add label in the window here 
     */ 
    } 
} 

Problem polega na tym, że po kliknięciu przycisku, to zajmuje trochę czasu, zanim widzę listę wyników, w czasie głównego aplikacja jest zamrożone. To dlatego, że nie używam żadnych wątków do rozwiązania tego problemu. Jak mogę zaimplementować wątki, aby każda etykieta była aktualizowana na każdym kroku pętli? Jestem nowy w wątkach i Swift, więc potrzebuję pomocy!

Dziękuję wam.

Odpowiedz

12

Istnieje GCD. Oto podstawowe użytkowanie:

for page in listOfPages { 
    var label = NSTextField() 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     let result = getInformationFromPage(page) 
     dispatch_async(dispatch_get_main_queue()) { 
      label.stringValue = result 
     } 
    } 
} 

dispatch_async funkcja asynchronicznie uruchamia blok kodu na danej kolejce. W pierwszym wywołaniu dispatch_async wysyłamy kod do uruchomienia w kolejce w tle. Po otrzymaniu result aktualizujemy etykietę na głównej kolejki z tego result

+0

Doskonała! Mam tylko wątpliwości, tutaj w twoim kodzie, gdzie powinienem ustawić ramkę etykiety w oknie? Przed trzecią linią? – Matt

+2

Nie wiem, czy to prawda w przypadku kakao, ale w dotyku kakao, nigdy nie powinieneś uzyskiwać dostępu do kodu ui na innym niż główny wątek. Więc przed pierwszą wysyłką i wewnątrz drugiego bloku wysyłkowego można bezpiecznie uzyskać dostęp do kodu ui – mustafa

+0

Dziękuję bardzo !! – Matt

11

Swift wersji 3.0

DispatchQueue.main.async() { 
    // your UI update code 
} 

Użyto tego powodu XCode nie może sugerować prawidłową składnię z szybkiej wersji 2.0

Powiązane problemy