获取 Parse 用户的用户名

Getting username of Parse user

我有代码试图获取 PFUser 的用户名。我得到了用户并能够打印出来,但是当我到达用户名行时,代码就停止了。没有崩溃,只是停止 运行?

知道它为什么会那样做吗?

    print(employeeObject)
    firstName.text = employeeObject.firstName
    lastName.text = employeeObject.lastName
    if employeeObject.roleType != nil {
        roleLabel.text = employeeObject.roleType?.roleName
    }
    if employeeObject.objectForKey("userPointer") != nil {
        employeeObject.userPoint = employeeObject.objectForKey("userPointer") as! PFUser
    }
    if employeeObject.userPoint != nil {
        let userID = employeeObject.userPoint!.objectId!
        let query = PFUser.query()
        query?.whereKey("objectId", equalTo: userID)
        query?.getFirstObjectInBackgroundWithBlock({ (userData : PFObject?, error : NSError?) in
            print(userData)
            self.userLoginSwitch.setOn(true, animated: false)
            self.userNameTextField.text = self.employeeObject.userPoint?.username!
            self.passwordTextField.text = ""
            self.emailAddressTextField.text = self.employeeObject.userPoint!.email
            if self.employeeObject.userPoint!.objectForKey("isAdmin") as! Bool {
                self.adminSwitch.setOn(true, animated: false)
            }
        })

    }
    if employeeObject.active {
        disableEnableEmployee.setTitle("Disable Employee", forState: .Normal)
    } else {
        disableEnableEmployee.setTitle("Enable Employee", forState: .Normal)
        disableEnableEmployee.setTitleColor(UIColor.blueColor(), forState: .Normal)
    }

我将 userPoint 转换为 PFUser,然后在 Parse 中我将其指向用户 table,当我打印时。我可以看到所有的信息。它只是停止工作思想,没有错误或解释。

var userPoint : PFUser? {
    get {return objectForKey("userPointer") as? PFUser}
    set { setObject(newValue!, forKey: "userPointer") }
}

如果你想从查询中打印用户名,它必须来自返回的对象,在你的情况下是 userData 并且你确定你的代码中没有任何断点,如果它只是停止?

self.userNameTextField.text = userData.username

当您从 Parse 指针中获取对象时,默认情况下不包括对象。只有 PFObjectobjectId。如果你想包含指针的所有属性,你需要使用带有指针名称的 includeKey 方法。因此,如果您从查询中获得 employeeObject(较早的某个地方),您应该添加行:

employeeQuery.includeKey("userPointer")

在此解决方案中,您不需要再次获取此用户,因为它是同一个对象。

@Mazels 的答案是第二种解决方案。您通过 objectId 获得相同的用户,因此您可以从 usedData

读取数据
self.userNameTextField.text = userData["username"]
self.emailAddressTextField.text = userData["email"]
if userData["isAdmin"] as! Bool { ...

最后一件事:

if employeeObject.objectForKey("userPointer") != nil {
    employeeObject.userPoint = employeeObject.objectForKey("userPointer") as! PFUser
}

这是多余的。查看 userPoint 和此 if 语句的实现。它真的什么都不做:)