Ios 一个接一个地运行函数就完成了

Ios 一个接一个地运行函数就完成了,ios,swift,Ios,Swift,我试图在pullData()完成后运行LoadView(),我想知道这样做的最佳方式是什么?我想设置一个10秒的超时时间,以便我可以显示一个网络错误,如果可能的话。从我所读到的内容来看,GCD看起来是实现这一点的方法,但我对它的实现感到困惑。谢谢你能给我的帮助 //1 pullData() //2 loadViews() 我也遇到过类似的情况,一旦数据从解析服务器中取出,我就必须初始化一个视图。我使用了以下方法: func fetchQuestionBank(complete:()->(

我试图在pullData()完成后运行LoadView(),我想知道这样做的最佳方式是什么?我想设置一个10秒的超时时间,以便我可以显示一个网络错误,如果可能的话。从我所读到的内容来看,GCD看起来是实现这一点的方法,但我对它的实现感到困惑。谢谢你能给我的帮助

//1
pullData()
//2
loadViews()

我也遇到过类似的情况,一旦数据从解析服务器中取出,我就必须初始化一个视图。我使用了以下方法:

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

您需要的是一个带有完成块的完成处理程序

创建一个非常简单:

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

您可以实现以下目标:-

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

使用函数一旦function1()函数完成,function2()将执行。

您可能只需将LoadView作为回调/完成块传递给pullData,这样每当pullData决定它完成拉取时,它就可以调用它。我该怎么做呢?如果我走那条路线,我还可以使用计时器吗?例如,通过搜索“快速完成块”——你的问题通常过于宽泛,会吸引主要基于意见的答案,如我的评论。您必须显示更多的上下文,准确地解释您想要实现的目标:计时器或在它完成后运行几乎是相反的。此外,你应该展示你迄今为止所做的尝试。我将查看完成块。谢谢你的建议。我指的更多的是块上的超时,而不是计时器。比如如果pullData()没有在10秒内完成超时并显示错误。这看起来很棒。谢谢分享。这会处理超时问题吗?在完成块上是否存在某种内置超时?如果存在超时,例如从web获取数据,则您只需调用完成,但失败
完成(成功:false)
。如果不调用,完成块不会自动触发。但您仍然可以在第一个任务中添加计时器,以检查xx秒后是否仍然没有结果。任何objective c版本:(
  function1();
  function2();