2016-02-12 84 views
5

我想在pullData()完成後運行loadViews(),我想知道做這個的最好方法是什麼?我想設置10秒的超時時間,如果可能的話,我可以顯示網絡錯誤。從我讀過的內容來看,GCD看起來就是實現這一目標的方式,但我對它的實現感到困惑。謝謝你提供的所有幫助!運行一個接一個的函數

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

你或許應該簡單地將loadView作爲回調/完成塊傳遞給pullData,以便每當pullData決定完成時拉它就可以cal它。 – luk2302

+0

我該如何去做呢?如果我去那條路線,我還可以實現一個計時器嗎? – Opei

+2

例如,通過搜索「swift completion block」 - 您的問題通常過於寬泛,並且會主要吸引我的評論等基於意見的答案。你將不得不展示更多的上下文,正確地解釋*想要達到的目標:計時器或完成後運行幾乎相反。此外,你應該顯示你到目前爲止嘗試過的。 – luk2302

回答

9

你需要的是完成處理程序與完成塊。

它非常簡單的創建一個:

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

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

,並使用您完成塊這樣的:

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

這看起來不錯。感謝分享。這會處理超時問題嗎?完成塊中是否存在某種內置超時? – Opei

+1

如果發生超時,就像是從Web中獲取數據一樣,那麼只需要以失敗'completion(success:false)'調用完成。如果沒有調用,完成塊不會自動啓動。但是您仍然可以在第一個任務中添加一個計時器,以檢查xx秒後是否仍然沒有結果。 –

+0

好的真棒謝謝你! – Opei

2

我有類似的情況,一旦數據從Parse服務器中提取,我不得不初始化視圖。我用下面的:

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

這就是你所謂的方法:

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

可以實現這樣的: -

func demo(completion: (success: Bool) -> Void) { 
    // code goes here 
    completion(success: true) 
} 
相關問題