最终保存2个不同的PFObject或两个都失败

时间:2015-01-14 16:33:55

标签: ios swift parse-platform

使用Parse SDK for iOS,我有2个表:

Game
- UserA : Pointer <_User>
- UserB : Pointer <_User>
- Round : Number
- IsTurnOfUserA : Bool

RoundScore
- GameId : Pointer <Game>
- User   : Pointer <_User>
- Score  : Number
- etc

游戏在2个用户之间进行3轮。

当用户结束回合时,它会切换Game.IsTurnOfUserA并将回合的得分保存到RoundScore表。

在iOS中,我没有找到更新游戏表的方法并保存RoundScore 最终(如果没有网络,可能会更晚)。

两者都必须完成或根本没有,但我不想最终只有一个查询成功而另一个失败。

使用Cloud Code,它应该很容易实现,但没有调用最终功能。

更新:也许Parse的本地数据库可以尝试一下?但我还不知道那个工具。

重要:RoundScore有一个依赖于Game的字段。如果Game Object是新的,它还没有ObjectId,但我仍然需要将它链接到RoundScore对象。

2 个答案:

答案 0 :(得分:1)

不幸的是saveEventually无法实现。

您需要做的是实现自己的网络检查代码并调用可以同时保存两者的云方法。那将是最好的选择。

你可以尝试替代的一种方法是将组合数据保存到另一个类并在服务器上有一个后台作业,将每个临时行转换成每个表中的一行,然后删除临时行。

这种黑客的缺点是后台作业只能每15分钟运行一次,因此可能会有15分钟的延迟。它还会为您的应用增加额外的复杂性和开销。

答案 1 :(得分:0)

正如Timothy Walters建议的那样, hack 没有任何后台工作:

我创建了一个假表,其中包含两个表GameRoundScore的列

GameAndRoundScore
- Game_UserA
- Game_UserB
- RoundScore_GameId
- RoundScore_Score
- etc

在Cloud Code中,我在保存

之前添加了此功能
Parse.Cloud.beforeSave("GameAndScoreRound", function(request, response) {
    var Game = Parse.Object.extend("Game");
    var game = new Game();
    game.set("UserA", request.object.get("game_UserA"));
    game.set("UserB", request.object.get("game_UserB"));
    game.save.then(function(newGame) {
        var RoundScore = Parse.Object.extend("RoundScore");
        var roundScore = new RoundScore();
        //roundScore.set(...)
        return scoreRound.save();
    }).then(function(newRoundScore) {
        response.success();
    });
});

然后,对于虚假的表格数据,我可以保留原样,也可以设置后台作业清空它,甚至可以在Parse后端手动清空表格。