0

我是 Parse api 的新手,正在尝试弄清楚如何执行以下操作:

我的应用程序存储字符串(“foo”、“bar”等)。无论用户尝试添加多少次,“foo”都应该只存在一次 - 以及尝试添加该字符串的次数。因此,如果四个用户尝试添加字符串“foo”,我希望关联PFObject看起来像:

name: "foo"
count: 4

(名称为“foo”的对象不应超过一个)

我知道我可以查询“foo”,检索它,然后更新计数,但我感觉如果多个用户同时尝试更新“foo”,就会存在竞争条件。

什么是通过 Parse API 实现此目的的正确/最佳方法(如果重要,我正在使用 iOS)。

4

2 回答 2

1

解析云代码beforeSavehttps://parse.com/docs/cloud_code_guide#functions-modifysave

在保存发生之前,检查该行是否存在,并更新它,然后返回response.error()

像这样的东西:

Parse.Cloud.beforeSave("MyObject", function(request, response) {
  var newObject = request.object;
  if(!newObject.existed()) {
    var query = new Parse.Query("MyObject");
    var name = newObject.get("name");
    query.equalTo("name", name);
    query.first().then(function(existing){
      if(existing){
        existing.increment("count");
        return existing.save().then(function(){
          response.error(name + " already exists");
        });
      }
      else {
        response.success();
      }
    });
  }
  else {
    response.success();
  }
});
于 2014-09-07T18:05:07.343 回答
1

Parse 为您提供了一个 incrementKey 方法,可帮助您避免多个用户尝试更新计数器时出现的问题。如果需要,您还可以减少或增加给定的数量。他们称之为计数器。但这只能解决竞争条件问题。

[myString incrementKey:@"count"];
[myString saveInBackground];

您可以在此处找到更多信息:https ://www.parse.com/docs/ios_guide#objects-updating/iOS 。

于 2014-09-08T09:57:29.773 回答