如何在 Swift 中同步检索 PFUser objectForKey

Posted

技术标签:

【中文标题】如何在 Swift 中同步检索 PFUser objectForKey【英文标题】:How to synchronously retrieve PFUser objectForKey in Swift 【发布时间】:2017-05-12 00:14:19 【问题描述】:

我正在尝试同步检索 PFUser 对象信息。但是,我尝试过使用 fetch,但我不断收到实现错误。我想找到例如:PFUser.currentUser()?.objectForKey("scoreNumber"),但我没有得到更新的值。有人告诉我我会使用 fetch 找到它,但我无法在我的 fetch 函数中实现 objectForKey。

一些尝试

var score: String!
func retrieveScore()
    guard let myUser = PFUser.currentUser() else  return 
      do let data = try myUser.objectForKey("scoreNumber")?.fetch()
        try scoreNumber = data! as! String
    catch

另一个

let userScore = PFUser.currentUser()?.objectForKey("scoreNumber")
let userScore2 = userScore.fetch()

【问题讨论】:

您确定您有一个已登录的用户吗? @ZonilyJame 是的,我用 NSUserDefaults 保存用户。 【参考方案1】:

您不应该为 NSUserDefaults 保存用户。 Parse SDK 可以很好地为您管理会话。只需有一个调用 [PFUser logout]` 功能的特定注销按钮。

所以,fetch 是一个异步操作。这意味着它运行在一个单独的线程上,然后主线程将继续执行下一个命令。因此,您正在调用 fetch,它在后台获取一个对象,但随后您正试图从尚未获取的对象中访问一个值。您需要从处理 fetch 调用结果的块中访问对象。

当您以您的方式调用 fetch 时,只需使用 .fetch(),它会在后台运行,但不会在您有数据时提醒您,也不会在 fetch 失败时提醒您。这不是立即获取您需要的数据的好方法。

你需要使用fetchInBackgroundWithBlock()

scoreNumber.fetchInBackgroundWithBlock() 
  (scoreNumber: PFObject?, error: NSError?) -> Void in
  if error == nil && scoreNumber != nil 
    print(scoreNumber)
   else 
    print(error)
  

【讨论】:

以上是关于如何在 Swift 中同步检索 PFUser objectForKey的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中注册使用 ParseUI 的 Facebook 按钮登录的 PFUser?

如何在 Swift 上将 Parse `PFUser` 从`MapView` 传递(抓取)到另一个`ViewController`?

在 Swift 中链接/合并 Facebook 用户和 PFUser(解析)

使用联合类从 PFUser 指针中检索更多信息

无法将类型 (PFUser!, NSError) void 的值转换为预期的参数类型 PFUserResultBlock

解析 PFUser.currentUser 返回 nil - Swift