我有一个复合查询,如下所示。
- (PFQuery *)queryForPhotos {
if (![PFUser currentUser]) {
PFQuery *query = [PFQuery queryWithClassName:kPAPPhotoClassKey];
[query setLimit:0];
return query;
}
// Query for users with the same language level
PFQuery *sameLevelUsersQuery = [PFUser query];
[sameLevelUsersQuery whereKey:kWSUserLanguageLevelKey equalTo:[[PAPCache sharedCache] languageLevelForUser:[PFUser currentUser]]];
sameLevelUsersQuery.cachePolicy = kPFCachePolicyNetworkOnly;
sameLevelUsersQuery.limit = 1000;
PFQuery *photosFromSameLevelUsersQuery = [PFQuery queryWithClassName:kPAPPhotoClassKey];
[photosFromSameLevelUsersQuery whereKey:kPAPPhotoUserKey matchesQuery:sameLevelUsersQuery];
[photosFromSameLevelUsersQuery whereKeyExists:kPAPPhotoPictureKey];
[photosFromSameLevelUsersQuery whereKey:kWSUniversalIsDeletedKey notEqualTo:[NSNumber numberWithBool:YES]];
[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey]; // THE INCLUDED KEY IN QUESTION
[photosFromSameLevelUsersQuery orderByDescending:@"createdAt"];
// A pull-to-refresh should always trigger a network request.
[photosFromSameLevelUsersQuery setCachePolicy:kPFCachePolicyNetworkOnly];
return photosFromSameLevelUsersQuery;
}
如果我留下这一行:
[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey]; // THE INCLUDED KEY IN QUESTION
然后我只得到1个在该字段中包含commentObject的photoObject。但是,DB中的3张(当前)26张照片在该字段中都有commentObjects,因此我应该在该字段中获得3张照片。一个commentObject加载了它的所有字段。
但是,如果我省略includeKey
行,那么所有3个带有该字段内某些内容的photoObject都会在该字段中返回一个commentObject。但是,在这种情况下,对象是空的,我必须调用fetchIfNeeded
来检索他们的数据。
我宁愿不这样做,如果我能在第一次以正确的方式加载数据,就必须在回调时重新加载tableView。
有什么想法吗?
答案 0 :(得分:1)
什么是photosQuery
?
应该是:
[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey];
答案 1 :(得分:1)
哦,伙计。所以这是一个ACL问题。对于其他人来说这个问题对于Parse和数据存储来说是新的,我发现很多奇怪的问题都会回到ACL问题。
否则问题非常具体:
我注意到我的ACL在我存储的较新评论中设置为:
{ “*”:{ “写”:真}}
这正是问题所在。根本没有设置读取ACL,因此任何人都无法读取评论对象。
为什么会这样?
之前我设置了这个云代码,因为我想要由对象创建者以外的其他人更改注释对象:
Parse.Cloud.beforeSave("Comments", function(request, response) {
Parse.Cloud.useMasterKey();
// Check if the isTitle field is being modified
var dirty = request.object.dirty("isTitle");
if (dirty == true) {
console.log("dirty == true");
var publicWriteACL = new Parse.ACL();
publicWriteACL.setPublicWriteAccess(true);
request.object.setACL(publicWriteACL);
}
response.success();
});
以前只有一个我设置isTitle
字段的实例,在这种情况下我希望其他人拥有写访问权限。
但是,我遇到了这个问题,所以我在创建一个Comment Object时开始设置isTitle
字段,因此调用了cloudCode beforeSave方法中的条件,改变了ACL。
关于Parse.com需要注意的一点是,在beforeSave中使用Parse.Cloud.useMasterKey();
时,ACL更改应该仅限于该函数。我相信是这样的 - 如果有人对此有更多正确的信息,请纠正我。但是,在这种情况下,似乎ACL更改成为永久性的。
这可能是因为它是在创建对象VS期间进行后续保存。