解析计数器是多线程的吗?
Are Parse Counters Multi-threaded?
我正在创建一个应用程序,它会根据用户的响应 increment/decrement 将值增加 1 或 2。如果多个用户同时尝试更改该值,它会正常工作吗?我的示例代码是:
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
[gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
[gameScore saveInBackground];
如果多人同时尝试更改"score",所有调用完成后分数是否准确?
不,这行不通。如果您在代码示例中如上所示明确设置新分数,则您有一个客户可能不知道另一个客户所做的更改的竞争条件。
解决这个问题的方法是使用 "increment" 函数。这会向服务器发送一个命令,以原子方式将服务器值增加一定数量,因此客户端实际上不需要关心他们发送的值是什么——他们只需将它增加一定数量。服务器处理请求的原子性质,并避免您在显式设置分数时看到的竞争条件。
[gameScore incrementKey:@"score"];
[gameScore saveInBackground];
或者如果你想增加超过 1...
[gameScore incrementKey:@"score" byAmount:@(2)];
[gameScore saveInBackground];
我正在创建一个应用程序,它会根据用户的响应 increment/decrement 将值增加 1 或 2。如果多个用户同时尝试更改该值,它会正常工作吗?我的示例代码是:
PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
[gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
[gameScore saveInBackground];
如果多人同时尝试更改"score",所有调用完成后分数是否准确?
不,这行不通。如果您在代码示例中如上所示明确设置新分数,则您有一个客户可能不知道另一个客户所做的更改的竞争条件。
解决这个问题的方法是使用 "increment" 函数。这会向服务器发送一个命令,以原子方式将服务器值增加一定数量,因此客户端实际上不需要关心他们发送的值是什么——他们只需将它增加一定数量。服务器处理请求的原子性质,并避免您在显式设置分数时看到的竞争条件。
[gameScore incrementKey:@"score"];
[gameScore saveInBackground];
或者如果你想增加超过 1...
[gameScore incrementKey:@"score" byAmount:@(2)];
[gameScore saveInBackground];