将本地状态和远程状态(Parse)同步连接不良

时间:2014-08-04 20:17:45

标签: parse-platform sync race-condition

目标:1)无论连接不良,用户都可以玩我的游戏, 2)在Parse上存储可靠的用户状态,以获得客户支持和统计信息。< / p>

我的方法:我使用本地客户端存储作为主服务器(因此不需要网络连接),并且我使用Parse作为辅助同步存储,以便我可以解决客户问题和保持统计数据。

  • 游戏有一系列固定级别。
  • 每个级别的用户状态在本地存储在UserDefaults中作为SOT(是的,有点难看)。
  • 我使用Parse作为客户支持问题和统计数据的辅助复制商店。
  • 因此,我还将级别状态存储在Parse上(即PFObject =&#34; UserLevel&#34 ;: userId,level#,status,high score,#wins,#losses等)。
  • 每个用户每个级别只有一个(或零)PFObject。

==&GT;当网络连接性差时,我经常会为同一级别创建多个PFObject。

e.g. A typical 5 minute game session:
  1. 用户解锁关卡:
    ==&GT;创建PFObject&#34; UserLevel&#34;:uid = currentUser,level =#,status = UNLOCKED,wins = 0等

  2. 用户播放此级别并输掉:
    ==&GT;查询(异步)解析PFObject(匹配userId&amp; level#):
    如果找到一个匹配的对象==&gt; ++ loss ...(saveEventually)
    如果&gt;找到1个匹配的对象==&gt; object [0]:++ loss ...(saveEventually)(忽略除了一个!) 否则(找不到匹配的对象)==&gt;创建新的PFObject。 (saveEventually)

  3. 用户再次播放并获胜:
    ==&GT;查询(异步)解析PFObject(匹配userId&amp; level#)
    如果找到一个匹配的对象:status = COMPLETED,++ wins ...(saveEventually)
    如果找到> 1个匹配的对象,则status = COMPLETED,++ wins ...(saveEventually)(忽略除一个以外的所有对象!)
    否则(找不到匹配的对象):创建PFObject。 (saveEventually)

  4. ......等......

  5. 您可以猜测,如果网络连接速度很慢,并且各种查询和saveEventually尚未完成,则很容易导致同一级别的重复PFObject。

    我的胆量告诉我在更新期间不创建PFObject(如果它不存在)。相反,Parse状态是草率/落后,并在应用程序启动期间清理它(即干净的同步)。

    我认为这是一种非常常见的设计模式,而且我缺少一些基本的CS基础知识。 (我是后端编码的新手。)

1 个答案:

答案 0 :(得分:0)

简单的解决方案,因为有固定数量的级别,是预先创建每个&#34; UserLevel&#34;并保存它们,然后在其他任何地方进行更新,而不是创建/更新。