2016-08-05 39 views
0

我有一个PFObjectAccount,它包含一个User的数组,它们是PFUsers的子类。 User然后有一个NSDictonary属性,allowableApps,这是一个NSDictionary的数组,其中他们的数组包含PFObject s。PFObject上的关系查询

所以,作为一个结构:

帐户

var users: [User] 

指向....

用户

// Each key is an array of AllowApp 
var allowableApps: NSMutableDictionary 

指向...

AllowableApp

var appName: String 
var appURL: String 
var isAllowed: Bool 

我想在一个查询来获取所有这些关系到AllowableApp。我试过使用这样的.includeKey

accountQuery?.includeKey("users") 
accountQuery?.includeKey("allowableApps") 

哪没有工作。我也试过:

accountQuery?.includeKey("users.allowableApps.appName") 
accountQuery?.includeKey("users.allowableApps.appURL") 
accountQuery?.includeKey("users.allowableApps.isAllowed") 

我尝试填充所有的AllowableApp对象UITableView,但是我得到这个错误:

Key "appName" has no data. Call fetchIfNeeded before getting its value. 

我的理解,我需要获取所有的他们在尝试访问appName财产之前。 (我试图设置cellForRowAtIndexPath)。


这里是我完整的查询:

let currentUser = User.currentUser() 
     let accountQuery = Account.query() 

     accountQuery?.whereKey("primaryUser", equalTo: currentUser!) 
     accountQuery?.includeKey("users.allowableApps") 

     accountQuery?.getFirstObjectInBackgroundWithBlock({ (account, error) in 

      if (error != nil) { 
       completion(users: nil, error: error) 
      } 
      else { 
       let users = (account as? Account)!.users 
       completion(users: users, error: nil) 
      } 
     }) 

我的想法,现在是刚刚通过的所有AllowableApp对象的循环中调用viewDidAppearfetchInBackgroundWithBlock。然后一旦他们全部加载,我重新加载表格数据。

这似乎真的很混乱和一个共同的问题。有没有更好的解决方案,我只是没有看到?

回答

0

从我的理解有以下结构:

  • 帐户
    • 用户(用户的阵列)
      • AllowsableApps(AllowApps数组)

首先将NSMutableDictionary更改为Array。 NSMutableDictionary是一个键值对,在解析时你应该创建一个字段。所以你可以使用ArrayApp的AllowApps,它会做同样的效果。

为了在每次需要建立以下查询帐户,每个用户允许的应用程序来获取所有帐户和用户:

// You can do it with sub classing if you want 
    let query = PFQuery(className: "Account") 
    query.includeKey("users.allowableApps") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [PFObject]?, error: NSError?) -> Void in 
    } 

现在为您的用户阵列。如果您的用户阵列是需要登录应用程序的用户,最好继承PFUser而不是从PFObject因为PFUser包含用于处理应用程序中用户的所有逻辑。

+0

嘿感谢您的回复!如果有意义的话,我的结构更多的是'Account' - >'Users' - >'AllowableApps'。此外,我正在使用'NSMutableDictionary',因为他们的键是我的表中的节标题视图。我想我理论上可以有一个'AppCategory',它是一个'PFObject',它有一个'AllowableApps'数组,但它看起来很健壮,只是持有一个类别名称。 – random

+1

嗨,是的,允许的应用程序应该在用户下,我想我的缩进现在工作得很好:)(我会更新我的答案)。无论如何,请根据答案尝试更改您的代码,因为我指的是与您相同的结构。 –

+0

我已更新我的问题以获取正在运行的完整查询。当我尝试你的建议代码时,我得到一个错误“只能包含指针字段”? – random