变量在if-else子句之后变为nil

时间:2016-02-10 19:07:04

标签: ios swift if-statement parse-platform

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

我应该如何修复以获取查询数据?

2 个答案:

答案 0 :(得分:5)

是零还是空字符串?我打赌它是后者。在Swift中,当你声明一个var时:

var StaffID = ""

它假定类型为String,而不是String?。这意味着它永远不会是零。

您在后台队列中异步设置StaffID的值,但是在后台队列进行更改以设置它之前打印它。如果您在块内(您已经这样做)打印它,您将获得正确的值。如果没有额外的同步逻辑,则不应该依赖于在不同线程/队列中设置的变量值。

答案 1 :(得分:3)

您的块是异步的。发生的事情是当你调用getFirstObjectInBackgroundWithBlock时,系统会在后台获取数据,然后你的代码继续执行。在完成数据获取之前打印“StaffID”。然后,稍后,该块将执行,并且您的staffID将被填充。

时间轴:

  1. 关闭系统发送数据
  2. 打印数据(目前还没有)
  3. 在您返回null之后数据到达。
  4. 你可以使用信号量等到阻止完成 - 使用类似这个问题的最佳答案:Wait for async task to finish completion block before returning in app delegate

    我认为这是一个更好的方法,但是看看你的设计,看看你是否无法处理块中的结果而不是等待它,并阻止主线程等待IO。