2016-02-12 14 views
5

pullData()の完了後にloadViews()を実行しようとしていますが、これを実行する最善の方法は何か疑問です。私はそれにも10秒のタイムアウトを設定したいので、可能であればネットワークエラーを表示することができます。私が読んだところから、GCDはこれを実現する方法のように見えますが、私はその実装について混乱しています。何か助けてくれてありがとう!別の関数が実行された後に1つの関数を実行する

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

あなたは、単に、おそらくべきコールバック/完了ブロックとしてloadViewsを渡して、pullDataがpullを完了したと判断するたびにcalData私はそれです。 – luk2302

+0

どうすればいいですか?また、私がそのルートに行くと、私はまだタイマーを実装することができますか? – Opei

+2

たとえば、「迅速完了ブロック」を検索すると、あなたの質問は一般に広すぎて、主に私のコメントのような意見に基づく回答を引き付けることになります。はるかに多くのコンテキストを示し、*正確に*達成したいことを説明しなければなりません。タイマーや完了後の実行はお互いの反対です。さらに、これまでに試したことを示す必要があります。 – luk2302

答えて

9

あなたが完了ブロックで完了ハンドラで必要なもの。

1を作成することが本当に簡単その:

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秒後にまだ結果が残っていないかどうかを確認するために、firstTaskにタイマーを追加することはできます。 –

+0

本当にありがとうございました! – Opei

2

私は、データが解析サーバから引き出された後のビューを初期化しなければならなかった似たような状況がありました。私は次のように使用:

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) 
} 
関連する問題