删除User对象时,删除其他类中的对象Parse.com

时间:2015-07-28 19:41:18

标签: ios parse-platform

我在Parse.com中有一个应用程序,其中包含3个简单类:UserAlphaBeta

    当新用户注册该应用程序时,将填充
  • User类。
  • 当这些用户创建内容(上传照片,声音,视频等)时,会填充
  • Alpha
  • 当其他用户对Beta类(共享,收藏等)的对象执行活动时,将填充
  • Alpha类。

手头的任务: 当从Alpha类中删除特定用户时,找到一种删除BetaUser类中所有对象的方法。现在,如果删除了用户,AlphaBeta类中的子对象仍然是孤立对象,其他用户仍然可以看到这些对象。这导致应用程序不一致。

由于我对Parse后端的理解可以忽略不计,我认为我应该Cloud CodeBackground Jobs一起使用(如果我是对的),但我不知道该如何去关于它。

2 个答案:

答案 0 :(得分:1)

CloudCode "afterDelete" triggers可能是个不错的选择。这样,可以立即清除孤立对象,并对已删除的用户进行现有引用。上面的链接包含一个非常相似的解决方案的一个很好的例子。

Parse.Cloud.afterDelete("Post", function(request) {
  query = new Parse.Query("Comment");
  query.equalTo("post", request.object.id);
  query.find({
    success: function(comments) {
      Parse.Object.destroyAll(comments, {
        success: function() {},
        error: function(error) {
          console.error("Error deleting related comments " + error.code + ": " + error.message);
        }
      });
    },
    error: function(error) {
      console.error("Error finding related comments " + error.code + ": " + error.message);
    }
  });
});

虽然后台作业可以正常工作,但它的缺点是在安排后台作业之前延迟清理。此外,由于用户已被删除,因此查询和处理孤立对象可能效率低下。

答案 1 :(得分:1)

Before / after delete hook is the way to go, a little bit more particular advice relating to the description of the app, assuming that Alpha objects have a pointer to __User called "createdBy".

I think it's good to get in the habit of using small, promise returning functions to carry out the asynchronous steps. Something like the following...

Parse.Cloud.beforeDelete(Parse.User, function(request, response) {
    var user = request.object;
    deleteAlphasForUser(user).then(function(result) {
        return deleteBetasForUser(user);
    }).then(function(result) {
        response.success(result);
    }, function(error) {
        response.error(error);
    });
});

function deleteAlphasForUser(user) {
    return alphasForUser(user).then(function(alphas) {
        return Parse.Object.destroyAll(alphas);
    });
}

function alphasForUser(user) {
    var query = new Parse.Query("Alpha");
    query.equalTo("createdBy", user);
    return query.find();
}

I didn't supply deleteBetasForUser or the function that fetches betas, but they ought to be very similar to the functions for the Alpha classes.