我可以依靠iOS设备时钟正确吗?

我正在开发一个应用程序,它将通过我控制的服务器在用户之间同步数据。 目前,我正在记录每个设备上的UTC更改时间,然后有助于确定哪些数据是最新的 – 服务器上或设备上的数据。

我可以依靠iPhone和iPad的UTC时间准确吗? 如果没有,我还能如何标记更新仍然可以让我检测来自不同用户的更新并检测可能的更新冲突?

为了您的目的,最好使用像http://en.wikipedia.org/wiki/Lamport_timestamps这样的逻辑时钟

绝对不能依赖iOS设备时钟是正确的。 用户可以将它们设置为他们喜欢的任何内容,而不必与时间服务器同步。

进行同步时,您可以通过获取设备的当前时间视图来开始此过程。 如果这与服务器的当前时间视图不同,则可以将此偏移量应用于正在上载的更改的时间戳,以使其进入“服务器时间”。 显然,这假设设备时钟在更改期间没有被更改 – 也就是说,它忽略了某些更改具有正确时间的可能性,并且有些需要应用偏移。

最安全的选择是跟踪这个偏移量,看看它是否会对同步冲突产生任何影响。 在任何会产生差异的情况下,应用偏移量,但在任何不会影响最新数据的情况下,使用设备中未修改的时间戳 – 如果用户回忆它是“3: 00pm“当他们做某事时,他们仍会看到该事件的时间戳为下午3点。 如果使用任何偏移计算,请不要忘记确保任何项目都不应该相对于服务器及时向前移动到将来声称它已经发生的程度。 🙂

对于分布式系统中的核心算法,不要依赖于多台计算机上的准确时间。

最大的问题(特别是偶尔连接设备之类的问题)是它们可以长时间断开连接并进行许多更改。 我们不是在谈论漂移,我们可能会谈论很长时间内没有连接到服务器的许多编辑而没有可靠的时间在设备上。

如果你想在一个不重要的系统(facebook应用程序,而不是财务)中对交错操作进行近似,那么服务器可以在每次更改时保持不断增加的变化 – 应用变更日志。 然后,当设备更改实体时,它会记录它并引用它知道的最后一个changeId。 将该实体修订版写回服务器将导致新的changeId被记录,但实体版本维护了设备写入时的changeId(确定实体写入历史中交错的位置)和新服务器changeId(自其他客户端获得自changedd x)以来的所有修订时使用。

然后,设备可以检索自上次更改后的所有更改,并且将获得所有实体 – 它可以根据它在编写时知道的changeId查看实体时订购修订。

这意味着连接更加一致的设备将在写入时获得更多(交错),而更多偶尔连接的设备将更频繁地丢失。 但是,所有修订都将被写入 – 只是最新的胜利。 您可以在字段或实体级别执行此操作。 如果在字段级别,不同用户的字段更改将毫不费力地合并 – 如果这是您想要的。

它是分布式修订的近似交错,它简单地根据您的上一条消息与服务器交错。