Счетчики разбора многопоточные?

Я создаю приложение, которое будет увеличивать / уменьшать значение на 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];
Другие вопросы по тегам