1

我有一个复合查询,如下所示。

 - (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。但是,数据库中(当前)26 张照片中有 3 张在该字段中有评论对象,因此我应该在该字段中获得 3 张带有某些内容的照片。一个commentObject 确实加载了它的所有字段。

但是,如果我省略了该includeKey行,那么在该字段中包含某些内容的所有 3 个 photoObjects 都会在该字段中返回一个 commentObject。但是,在这种情况下,对象是空的,我必须调用fetchIfNeeded来检索它们的数据。

如果我可以第一次以正确的方式加载数据,我宁愿不这样做,并且必须在回调时重新加载 tableView。

有任何想法吗?

4

2 回答 2

1

天啊。所以这是一个 ACL 问题。对于其他对 Parse 和一般数据存储来说是新的问题的人来说,我发现很多奇怪的问题都回到了 ACL 问题。

否则问题非常具体:

  • 我注意到我的 ACL 在我存储的较新评论上设置为:

    {"*":{"write":true}}

这正是问题所在。根本没有设置读取 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字段,在这种情况下,我希望其他人具有写入权限。

但是,我遇到了这个问题,所以我isTitle在创建评论对象时开始设置字段,因此调用了 cloudCode beforeSave 方法中的条件,更改了 ACL。


关于 Parse.com 需要注意的一件事是,Parse.Cloud.useMasterKey();在 beforeSave 中使用时,ACL 更改应该仅限于该函数。我相信是这样 - 如果有人对此有更正确的信息,请纠正我。但是,在这种情况下,ACL 更改似乎是永久性的。

这可能是因为它是在创建对象 VS 期间进行的后续保存。

于 2013-10-05T19:48:58.060 回答
1

是什么photosQuery

那应该是:

[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey];
于 2013-10-05T13:27:59.760 回答