parse.com Сохранение определенного значения один раз
Я новичок в API Parse и пытаюсь выяснить, как сделать следующее:
Мое приложение хранит строки ("foo", "bar" и т. Д.). "foo" должен существовать только один раз, независимо от того, сколько раз пользователи пытались добавить его, а также количество попыток добавления этой строки. Таким образом, если четыре пользователя попытаются добавить строку "foo", я бы хотел PFObject
выглядеть как:
name: "foo"
count: 4
(не должно быть более одного объекта с именем "foo")
Я знаю, что могу запросить "foo", получить его, а затем обновить счетчик, но у меня есть ощущение, что существует состояние гонки, если несколько пользователей пытаются обновить "foo" одновременно.
Какой правильный / лучший способ добиться этого через Parse API (я использую iOS, если это имеет значение).
2 ответа
Разобрать облачный код beforeSave
, https://parse.com/docs/cloud_code_guide
Перед сохранением проверьте наличие строки и обновите ее, затем верните 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();
}
});
Parse предоставляет вам метод incrementKey, который помогает избежать проблем, когда несколько пользователей пытаются обновить счетчик. Вы также можете уменьшить или увеличить на определенную сумму, если это необходимо. Они называют это Счетчики. Но это только решает проблему состояния гонки.
[myString incrementKey:@"count"];
[myString saveInBackground];
Вы можете найти дополнительную информацию здесь: https://www.parse.com/docs/ios_guide.