如何在swift中调用另一个函数之前等待后台函数完成?

时间:2015-07-27 13:18:24

标签: xcode swift asynchronous parse-platform background

我将简要解释一下情况。 我正在构建一个测验应用程序,我希望它主要使用互联网,但也可以在用户断开连接时工作一段时间。我使用的旧代码仅使用同步查询,它花费的时间比我预期的要多。所以我决定重新制定它。 我预测的情况如下:

  • 当我的用户选择主题时,应用会同步为每个子主题提出1个问题,以便为我做好准备用户点击并加快速度。

  • 在得到第一个问题之后,应用程序将为每个子主题 异步获得另外4个(或需要多少才能完成5个),当用户被占用时回答提交给他的第一个问题。

  • 最后,应用程序会将对象保存在本地数据存储区中,这样用户可以在未连接时为每个子主题回答5个问题。

这是我的代码:

func getQuestionsRemotelyandSave (subsubject:String?, subject:String?, arrayOfSubsubjects:[String]?) {
    self.getFromUserDefaults()
    if Reachability.isConnectedToNetwork() == true {
            if self.needsToGetQuestions == true {
                let user = PFUser.currentUser()
                var query = PFQuery(className: "Questions")
                query.whereKey("answeredBy", equalTo: user)
                query.whereKey("grade", equalTo: user["grade"])

                if subsubject != nil && subject == nil {
                    query.whereKey("subsubject", equalTo: subsubject)
                    query.limit = 2
                    let array = query.findObjects()
                    for item in array {
                        let object = item as PFObject
                        var QuestionToPin = PFObject(className: "Questions")
                        QuestionToPin["Question"] = object["Question"] as String
                        QuestionToPin["rightAnswer"] = object ["rightAnswer"] as String
                        QuestionToPin["wrongAnswer1"] = object ["wrongAnswer1"] as String
                        QuestionToPin["wrongAnswer2"] = object ["wrongAnswer2"] as String
                        QuestionToPin["wrongAnswer3"] = object ["wrongAnswer3"] as String
                        QuestionToPin["grade"] = object["grade"] as String
                        QuestionToPin["subject"] = object ["subject"] as String
                        QuestionToPin["subsubject"] = object ["subsubject"] as String
                        QuestionToPin["feedback"] = object ["feedback"] as? String
                        QuestionToPin["shortFeedback1"] = object ["shortFeedback1"] as? String
                        QuestionToPin["shortFeedback2"] = object ["shortFeedback2"] as? String
                        QuestionToPin["shortFeedback3"] = object ["shortFeedback3"] as? String
                        QuestionToPin.pin()
                    }
                    query.limit = 3
                    query.findObjectsInBackgroundWithBlock({ (objects:[AnyObject]!, error:NSError!) -> Void in
                        if error == nil {
                            let questions = objects as [PFObject]
                            var QuestionsToPin = [PFObject]()
                            for object in questions {
                                var QuestionToPin = PFObject(className: "Questions")
                                QuestionToPin["Question"] = object["Question"] as String
                                QuestionToPin["rightAnswer"] = object ["rightAnswer"] as String
                                QuestionToPin["wrongAnswer1"] = object ["wrongAnswer1"] as String
                                QuestionToPin["wrongAnswer2"] = object ["wrongAnswer2"] as String
                                QuestionToPin["wrongAnswer3"] = object ["wrongAnswer3"] as String
                                QuestionToPin["grade"] = object["grade"] as String
                                QuestionToPin["subject"] = object ["subject"] as String
                                QuestionToPin["subsubject"] = object ["subsubject"] as String
                                QuestionToPin["feedback"] = object ["feedback"] as? String
                                QuestionToPin["shortFeedback1"] = object ["shortFeedback1"] as? String
                                QuestionToPin["shortFeedback2"] = object ["shortFeedback2"] as? String
                                QuestionToPin["shortFeedback3"] = object ["shortFeedback3"] as? String
                                QuestionToPin.pinInBackground()
                            }
                        }
                    })
                }

                if subsubject == nil && subject != nil {
                    var firstTime = true
                    var semaphore = dispatch_semaphore_create(0)
                    query.limit = 1
                    for item in arrayOfSubsubjects! {
                        if item != "Todas as matérias" {
                            var query3 = PFQuery(className: "Questions")
                            query3.fromLocalDatastore()
                            query3.whereKey("subsubject", equalTo: item)
                            let count = query3.countObjects()
                            if count == 0 {
                                query.whereKey("subsubject", equalTo: item)

                                let array:NSArray = query.findObjects()
                                for item in array {
                                    let object = item as PFObject
                                    var QuestionToPin = PFObject(className: "Questions")
                                    QuestionToPin["Question"] = object["Question"] as String
                                    QuestionToPin["rightAnswer"] = object ["rightAnswer"] as String
                                    QuestionToPin["wrongAnswer1"] = object ["wrongAnswer1"] as String
                                    QuestionToPin["wrongAnswer2"] = object ["wrongAnswer2"] as String
                                    QuestionToPin["wrongAnswer3"] = object ["wrongAnswer3"] as String
                                    QuestionToPin["grade"] = object["grade"] as String
                                    QuestionToPin["subject"] = object ["subject"] as String
                                    QuestionToPin["subsubject"] = object ["subsubject"] as String
                                    QuestionToPin["feedback"] = object ["feedback"] as? String
                                    QuestionToPin["shortFeedback1"] = object ["shortFeedback1"] as? String
                                    QuestionToPin["shortFeedback2"] = object ["shortFeedback2"] as? String
                                    QuestionToPin["shortFeedback3"] = object ["shortFeedback3"] as? String
                                    QuestionToPin.pin()
                                }

                            }

                            if count > 0 {
                                var limit = 5 - count
                                if limit < 0 {
                                    limit = 0
                                }
                                query.limit = limit
                                if firstTime == false {
                                    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
                                }
                                query.findObjectsInBackgroundWithBlock({ (objects:[AnyObject]!, error:NSError?) -> Void in
                                    if error == nil {
                                        let questions = objects as [PFObject]
                                        for object in questions {
                                            var QuestionToPin = PFObject(className: "Questions")
                                            QuestionToPin["Question"] = object["Question"] as String
                                            QuestionToPin["rightAnswer"] = object ["rightAnswer"] as String
                                            QuestionToPin["wrongAnswer1"] = object ["wrongAnswer1"] as String
                                            QuestionToPin["wrongAnswer2"] = object ["wrongAnswer2"] as String
                                            QuestionToPin["wrongAnswer3"] = object ["wrongAnswer3"] as String
                                            QuestionToPin["grade"] = object["grade"] as String
                                            QuestionToPin["subject"] = object ["subject"] as String
                                            QuestionToPin["subsubject"] = object ["subsubject"] as String
                                            QuestionToPin["feedback"] = object ["feedback"] as? String
                                            QuestionToPin["shortFeedback1"] = object ["shortFeedback1"] as? String
                                            QuestionToPin["shortFeedback2"] = object ["shortFeedback2"] as? String
                                            QuestionToPin["shortFeedback3"] = object ["shortFeedback3"] as? String

                                            QuestionToPin.pinInBackground()
                                        }
                                        dispatch_semaphore_signal(semaphore)
                                        firstTime = false
                                    }
                                })

                            }
                        }
                    }
                }

            }
      }
  }

我面临的问题是我无法从Parse请求多个异步函数。我想的可能是等待异步函数在另一个函数启动之前完成,但我希望它能在没有用户等待的情况下发生。有办法吗?

谢谢。

0 个答案:

没有答案