2016-02-12 66 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) 
}