2016-02-12 16 views
5

Próbuję uruchomić loadViews() po zakończeniu funkcji pullData() i zastanawiam się, jaki jest najlepszy sposób na wykonanie tej czynności? Chciałbym ustawić 10-sekundowy limit czasu, aby móc wyświetlić błąd sieci, jeśli to możliwe. Z tego, co przeczytałem, wygląda na to, że GCD jest sposobem na osiągnięcie tego, ale jestem zdezorientowany na jego implementację. Dzięki za pomoc, jaką możesz dać!Uruchamianie jednej funkcji za drugą kończy

//1 
pullData() 
//2 
loadViews() 
+7

zalecana prawdopodobnie po prostu przekaż loadViews jako blok oddzwaniania/zakończenia do pullData, aby za każdym razem, gdy pullData zadecyduje, że zakończyło się ciągnięciem, może to zrobić cal ja to. – luk2302

+0

Jak mam to zrobić? Czy nadal mogę wdrożyć zegar, jeśli przejdę na tę trasę? – Opei

+2

Poszukując np. "Bloku szybkiego zakończenia" - twoje pytanie jest na ogół zbyt szerokie i przyciągnie przede wszystkim odpowiedzi oparte na opiniach, takie jak mój komentarz. Musiałbyś pokazać znacznie więcej kontekstu, wyjaśnić * dokładnie *, co chcesz osiągnąć: licznik czasu lub bieg po zakończeniu jest prawie przeciwieństwem siebie. Ponadto powinieneś pokazać, co próbujesz do tej pory. – luk2302

Odpowiedz

9

Co trzeba to handler ukończenie z bloku zakończenia.

Jej naprawdę łatwe tworzenie jednego:

func firstTask(completion: (success: Bool) -> Void) { 
    // Do something 

    // Call completion, when finished, success or faliure 
    completion(success: true) 
} 

i korzystać z bloku zakończenia tak:

firstTask { (success) -> Void in 
    if success { 
     // do second task if success 
     secondTask() 
    } 
} 
+0

To wygląda świetnie. Dziękuję za udostępnienie. Czy rozwiązałoby to problem z przekroczeniem limitu czasu? Czy są jakieś wbudowane limity czasu na blokach ukończenia? – Opei

+1

Jeśli istnieje limit czasu, np. Jeśli pobierasz dane z Internetu, to po prostu wywołujesz zakończenie z błędem 'zakończenie (sukces: fałsz)'. Blok ukończenia nie będzie automatycznie uruchamiany, jeśli nie zostanie wywołany. Ale nadal możesz dodać zegar w swojej pierwszej zadaniu, aby sprawdzić, czy po xx sekundach nadal nie ma wyników. –

+0

Ok, niesamowite dzięki! – Opei

2

Miałem podobną sytuację, w której musiałem zainicjować widok po pobraniu danych z serwera Parse. Użyłem następujących czynności:

func fetchQuestionBank(complete:()->()){ 

     let userDefault = NSUserDefaults.standardUserDefaults() 
     let username = userDefault.valueForKey("user_email") as? String 

     var query = PFQuery(className:"QuestionBank") 
     query.whereKey("teacher", equalTo: username!) 

     query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]?, error:NSError?) -> Void in 

      if error == nil { 
       if let objects = objects as? [PFObject] { 

        var questionTitle:String? 
        var options:NSArray? 

        for (index, object) in enumerate(objects) { 

         questionTitle = object["question_title"] as? String 
         options = object["options"] as? NSArray 
         var aQuestion = MultipleChoiceQuestion(questionTitle: questionTitle!, options: options!) 
         aQuestion.questionId = object.objectId! 
         InstantlyModel.sharedInstance.questionBank.append(aQuestion) 
        } 


        complete() 
       } 
      }else{ 
       println(" Question Bank Error \(error) ") 
      } 
     } 
    } 

A to wywołać metodę:

self.fetchQuestionBank({() ->() in 
         //Once all the data pulled from server. Show Teacher View. 
         self.teacherViewController = TeacherViewController(nibName: "TeacherViewController", bundle: nil) 
         self.view.addSubview(self.teacherViewController!.view) 
        }) 
2

można osiągnąć w ten sposób: -

func demo(completion: (success: Bool) -> Void) { 
    // code goes here 
    completion(success: true) 
} 
Powiązane problemy