同步调度不起作用?

时间:2015-02-15 19:23:11

标签: ios swift firebase grand-central-dispatch

也许我不理解这个概念,但是第二段代码不应该在第一段代码完成之前等待?

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
    // do some task
    var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
    myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
        println("WE ARE IN HERE")
        firstName = snapshot.value["firstName"] as String!
        lastName = snapshot.value["lastName"] as String!
    })
});

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
    // do some task
    var standbyData = [
        "firstName":firstName,
        "lastName":lastName,
        "duration":self.helpDurationLabel.text!,
        "radius":self.helpRadiusLabel.text!,
        "categories": categories,
        "time_stamp":self.date.timeIntervalSince1970
    ]
    println("WE ARE OUT HERE")
    var standbyUserRef = self.standbyRef.childByAppendingPath(self.userRef.authData.uid)
    standbyUserRef.updateChildValues(standbyData)
});

我有什么遗失的吗?

输出是:

"WE ARE OUT HERE"
"WE ARE IN HERE"

2 个答案:

答案 0 :(得分:2)

它会等到第一次完成执行。在系统令人困惑的地方,您使用的是myRef.observeSingleEventOfType(, withBlock:

99%的请求执行块的API会将其操作推送到单独的线程,然后在完成时执行该块。 observeSingleEventOfType可能在将其执行安排到操作队列后不久返回,导致dispatch_sync在执行块之前退出。

相反,你可能正在寻找更像这样的东西:

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
    // do some task
    var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
    myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
        println("WE ARE IN HERE")
        firstName = snapshot.value["firstName"] as String!
        lastName = snapshot.value["lastName"] as String!

        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
            // do some task
            var standbyData = [
                "firstName":firstName,
                "lastName":lastName,
                "duration":self.helpDurationLabel.text!,
                "radius":self.helpRadiusLabel.text!,
                "categories": categories,
                "time_stamp":self.date.timeIntervalSince1970
            ]
            println("WE ARE OUT HERE")
            var standbyUserRef = self.standbyRef.childByAppendingPath(self.userRef.authData.uid)
            standbyUserRef.updateChildValues(standbyData)
        });
    })
});

答案 1 :(得分:0)

dispatch_get_global_queue用于在后台同时运行任务意味着任何任务都可以先运行。当你正在打印“我们在”和“我们在外面”意味着任何人都可以先跑。 而不是它我会建议连续而不是同时运行任务 dispatch_queue_create用于串行运行任务。 我希望以下代码可以帮助解决这个问题。

var backgroundQueue:dispatch_queue_t =  dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL)

        dispatch_sync(backgroundQueue, { () -> () in
            // do some task
            var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
            myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
                println("WE ARE IN HERE")
                firstName = snapshot.value["firstName"] as String!
                lastName = snapshot.value["lastName"] as String!
            })
        });

        dispatch_sync(backgroundQueue, { () -> () in
            // do some task
            var standbyData = [
                "firstName":firstName,
                "lastName":lastName,
                "duration":self.helpDurationLabel.text!,
                "radius":self.helpRadiusLabel.text!,
                "categories": categories,
                "time_stamp":self.date.timeIntervalSince1970
            ]
            println("WE ARE OUT HERE")
            var standbyUserRef = self.standbyRef.childByAppendingPath(self.userRef.authData.uid)
            standbyUserRef.updateChildValues(standbyData)
        });