关于PFObject

时间:2016-08-05 16:26:48

标签: swift parse-platform pfobject

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

这看起来非常混乱,也是一个常见的问题。有没有更优雅的解决方案,我只是没有看到?

1 个答案:

答案 0 :(得分:0)

根据我的理解,你有以下结构:

  • 帐户
    • 用户(用户数组)
      • AllowableApps(AllowApps数组)

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