我有一个PFObjectAccount包含User的数组,这些数组是PFUsers的子类。 User然后具有NSDictonary属性,即allowableApps,它是数组的NSDictionary,其中数组包含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")




我尝试用所有UITableView对象填充AllowableApp,但出现此错误:

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的所有viewDidAppear对象。然后,一旦它们全部加载,我就重新加载表数据。

这看起来确实很混乱,是一个普遍的问题。有没有我看不到的更优雅的解决方案?

最佳答案

据我了解,您具有以下结构:


帐户


用户(用户数组)


AllowsableApps(AllowApps的数组)




首先,将NSMutableDictionary更改为Array。 NSMutableDictionary是一个键值对,在解析中,您应该创建一个字段。因此,您可以使用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包含处理应用程序中用户的所有逻辑。

10-08 12:58