如何使用所有(递归)子进程获取PFUser对象

时间:2015-07-03 17:19:51

标签: ios swift parse-platform

我有以下结构:

我的用户表有一个名为experienceArray的字段,它只是指向另一个名为experience的表的指针数组。每个experience对象都有一个指向另一个表Sport的指针。 Sport只是一个包含Title(String)的简单表。我试图在tableview中显示每个对象的标题。不幸的是,我在tableview委托中遇到异常,我将标题值分配给我的tableview单元格标签。

var object : PFObject = self.chosenSports[indexPath.row]["sport"] as! PFObject

以下是它的内容: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Key "title_en" has no data. Call fetchIfNeeded before getting its value.'

这条消息对我来说绝对有意义 - 它不会获得最内在的子对象,只有它们的objectIds。

这就是我的所作所为:

var query = PFUser.query()
query!.includeKey("experienceArray")
query!.includeKey("experienceArray.Sport")
query!.includeKey("experienceArray.Sport.title_en")
query!.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!)
query!.findObjectsInBackgroundWithBlock { (result: [AnyObject]?, error:NSError?) -> Void in
    println("sports result: \(result)")
    var res = result as! NSArray
    var user = res[0]
    self.chosenSports = user["experienceArray"] as! NSMutableArray
    self.sportsTableView.reloadData()
}

如何更改代码以接收PFUser对象及其所有子代中包含的所有信息?

2 个答案:

答案 0 :(得分:1)

你可以尝试一下,告诉我它是否有效:

PFUser.currentUser().fetchIfNeeded { user, error in
   if error == nil && user != nil {
          if let sports = user["experienceArray"] as? [PFObject] {
              let query = PFQuery(className: "Sport") // Change to correct name.
              query.whereKey("objectId", containedIn: sports.map { $0.objectId })
              query.findObjectsInBackgroundWithBlock { (results, error) -> Void in 
                     // TODO: Use results
              }
          }
     }
}

当然,因为我不知道你是如何将内容保存到iVars中的,所以我在块中包含了代码,但你可以简单地将其分配给ivar。这应该有用。

编辑:更改了代码以仅发出2个请求。另请注意,代码不能处理错误,但这应该很容易。

答案 1 :(得分:0)

我决定用云代码获取所有孩子,然后从App调用云功能。这非常简单,结果证明是最好的解决方案,因为现在每个系统(iOS和Android)上的代码更少