从IF子句中的parse执行查询并存储在StaffID中。我得到了我想要的东西。
但是在if / else子句之后,StaffID变量变为Nil
这是代码
func StaffIdQuery(DeviceToken: String) -> String
{
var StaffID = ""
let StaffIdQuery = PFQuery(className: "Staff")
StaffIdQuery.whereKey("StaffDeviceToken", equalTo: DeviceToken)
StaffIdQuery.getFirstObjectInBackgroundWithBlock {
(objects:PFObject?, error: NSError?) -> Void in
if error == nil && objects != nil {
StaffID = objects?.valueForKey("StaffID") as! String
print(StaffID) //This seems fine
}
else {
// Log details of the failure
print("Error: \(error!) \(error!.userInfo)")
}
}
print(StaffID) //this becomes nil
return StaffID
}
我应该如何修复以获取查询数据?
答案 0 :(得分:5)
是零还是空字符串?我打赌它是后者。在Swift中,当你声明一个var时:
var StaffID = ""
它假定类型为String
,而不是String?
。这意味着它永远不会是零。
您在后台队列中异步设置StaffID的值,但是在后台队列进行更改以设置它之前打印它。如果您在块内(您已经这样做)打印它,您将获得正确的值。如果没有额外的同步逻辑,则不应该依赖于在不同线程/队列中设置的变量值。
答案 1 :(得分:3)
您的块是异步的。发生的事情是当你调用getFirstObjectInBackgroundWithBlock时,系统会在后台获取数据,然后你的代码继续执行。在完成数据获取之前打印“StaffID”。然后,稍后,该块将执行,并且您的staffID将被填充。
时间轴:
你可以使用信号量等到阻止完成 - 使用类似这个问题的最佳答案:Wait for async task to finish completion block before returning in app delegate
我认为这是一个更好的方法,但是看看你的设计,看看你是否无法处理块中的结果而不是等待它,并阻止主线程等待IO。