这是我怎么会做它(假设你可以改变服务器的代码):
首先,存储在本地“同步日期”某处的应用程序。然后,对于每个任务,存储修改的日期。每当任务被修改时,将修改日期设置为当前日期。然后,当您想与服务器同步时:
- 将在“同步日期”之后修改的所有任务上载到服务器。另外,将“同步日期”发送到服务器。
- 服务器响应修改日期在指定同步日期之后的所有任务。
- 服务器然后通过上传的项目并保存它们。
- 该应用程序然后保存从服务器下载的所有任务,创建新的或根据需要更新现有的任务...
- 然后,应用程序会遍历从服务器返回的所有项目,查找最新的修改日期。如果最新修改日期晚于应用的“同步日期”,请将“同步日期”设置为最新修改日期。
对于删除任务,我会在每个任务上都有一个“已删除”标志。当任务被删除时,它的“已删除”标志被设置为true。它仍然会同步到服务器,但是如果从设置了“已删除”标志的服务器下载任务,则应从数据库中删除该任务...
GCD
至于GCD,它看起来像Alamofire库负责的一切给你,所以你并不需要使用它。如果你确实想使用它,它是非常简单的:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND), ^{
// This code will run in the background, so it doesn't matter
// how long it takes, it won't freeze the app...
});
dispatch_async(dispatch_get_main_queue(), ^{
// This code will run on the main thread...
});
它还有更多的功能...
我同意很多,但我会建议存储本地日期和使用用于查找在服务器上给定日期已更改的记录,例如在响应客户端请求“从X获取记录”时,服务器将以“从Y开始,这里是从X开始的所有新记录”的功能答复,然后应用程序可以在将来的请求中使用Y.更好的是,根本不使用时间戳,而是使用一些服务器生成的唯一标识符(例如复制标识,或者你有什么)。这完全消除了较小的时间差异等风险。 – Rob 2015-02-10 14:35:09
伟大的模式。 @Rob,有关复制ID的进一步阅读?听起来很有趣 – jlhonora 2015-02-10 17:05:34
这个想法很简单。让服务器跟踪更新的顺序,通过更改/修改/删除日期,某个唯一标识符或某个序号来标识它们。有时候你会在表格中做到这一点。有时你会有一个单独的更新表(有时由原始表上的触发器填充)。但是无论使用什么标识符,都要让客户端跟踪从server_接收到的最后一个标识符,并且在未来某个时刻请求更多更新时,将相同的标识符传递回服务器。 – Rob 2015-02-14 04:57:53