我有一个PFObject
,Account
包含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包含处理应用程序中用户的所有逻辑。