Счетчики разбора многопоточные?
Я создаю приложение, которое будет увеличивать / уменьшать значение на 1 или 2 на основе ответов от пользователей. Если несколько пользователей попытаются изменить значение одновременно, будет ли оно работать правильно? Мой пример кода:
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
[gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
[gameScore saveInBackground];
Если несколько человек попытаются изменить "счет" одновременно, будет ли счет точным после завершения всех вызовов?
1 ответ
Нет, это не сработает. У вас есть условие гонки, при котором клиент может не знать об изменениях, внесенных другим клиентом, если вы явно устанавливаете новый счет, как указано выше в своем примере кода.
Что вы можете сделать, чтобы решить эту проблему, с помощью функции "приращения". Это отправляет команду на сервер для атомарного увеличения значения сервера на определенную величину, поэтому клиентам на самом деле не нужно заботиться о том, какое значение они отправляют - они просто увеличивают его на определенную величину. Сервер обрабатывает атомарную природу запроса и избегает условий гонки, которые вы бы увидели, если бы вы явно устанавливали счет.
[gameScore incrementKey:@"score"];
[gameScore saveInBackground];
или если вы хотите увеличить более чем на 1...
[gameScore incrementKey:@"score" byAmount:@(2)];
[gameScore saveInBackground];