也许我不理解这个概念,但是第二段代码不应该在第一段代码完成之前等待?
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"
答案 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)
});