最终保存 2 个不同的 PFObjects 或者都失败

Save 2 different PFObjects eventually or fail both

使用 iOS 的 Parse SDK,我有 2 tables :

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 table.

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

两者都必须完成或 none 都必须完成,但我不想以两个查询中只有一个成功而另一个失败的结果告终。

使用 Cloud Code,这样做应该很容易,但是没有调用 eventually 函数。

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

重要提示:RoundScore 有一个字段依赖于 Game。如果游戏对象是新的,它还没有 ObjectId,但我仍然需要 link 它到 RoundScore 对象。

不幸的是,saveEventually 是不可能的。

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

您可以尝试的替代方法是将组合数据保存到另一个 class 并在服务器上进行后台作业,将单个临时行变成每个 table 中的一行,然后删除临时行。

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

正如 Timothy Walters 所建议的,这里是 hack,没有任何后台作业:

我创建了一个伪造的 table,其中包含 tables 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();
    });
});

然后对于伪造的 table 数据,我可以将其保留原样或设置一个清空它的后台作业,甚至可以在解析后端手动清空 table。