2016-02-12 16 views
5

pullData() tamamlandıktan sonra loadViews() çalıştırmayı deniyorum ve bunun en iyi yolunun ne olduğunu merak ediyorum. Mümkünse bir ağ hatası görüntüleyebilmek için 10 saniyelik bir zaman aşımı ayarlamak istiyorum. Okuduklarımdan GCD, bunu başarmanın yolu gibi görünüyor ama bunun uygulanması konusunda kafam karıştı. Verebileceğiniz herhangi bir yardım için teşekkürler!Başka bir işlevin tamamlanmasından sonra çalıştırılması

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

yapmanız gerekir muhtemelen sadece LoadData'ları geri çekme/tamamlama bloğu olarak dataData içine geçirerek, drawData her ne zaman pullData onu tamamladıktan sonra çekebilir. Aydınlatılmış. – luk2302

+0

Bunu yapmayı nasıl yaparım? O rotaya gidersem hala bir zamanlayıcı kullanabilir miyim? – Opei

+2

Örneğin "hızlı tamamlama bloğu" aranarak - sorunuz genellikle çok geniştir ve yorumum gibi temel olarak fikir bazlı cevapları çekecektir. Daha fazla bağlam göstermek zorundasınız, * tam olarak * ne elde etmek istediğinizi açıklayın: bir zamanlayıcı veya tamamlandıktan sonra koşmak birbirinin tam tersidir. Üstelik şimdiye kadar denediğiniz şeyi göstermelisiniz. – luk2302

cevap

9

Ne gerek bir tamamlama bloğu ile bir tamamlama işleyicisi olan aşağıdaki kullanılır.

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

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

Ve bu gibi tamamlama bloğu kullanın::

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

Bu harika görünüyor. Paylaşım için teşekkürler. Bu bir zaman aşımı sorunu halledebilir mi? Tamamlama bloklarında bir zaman aşımı süresi var mı? – Opei

+1

Bir zaman aşımı varsa, web'den veri alıyormuşsunuz gibi, başarısızlık tamamlandı (tamam: başarısız) ile tamamlamayı çağırırsınız. Tamamlanma bloğu, çağrı yapılmadığında otomatik olarak yanmaz. Ancak yine de, xx saniye sonra hala sonuç olup olmadığını kontrol etmek için firstTask'ta bir zamanlayıcı ekleyebilirsiniz. –

+0

Tamam harika teşekkür ederim! – Opei

2

Veriler Parse sunucusundan çekildikten sonra bir görünümü başlatmak zorunda kaldığım benzer bir durum vardı.

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) ") 
      } 
     } 
    } 

Ve bu yöntemi çağırmak geçerli::

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

Böyle elde edebilirsiniz: bir tane oluşturmak için

Onun gerçekten basit -

func demo(completion: (success: Bool) -> Void) { 
    // code goes here 
    completion(success: true) 
} 
İlgili konular