【问题标题】:iOS - API SynchronizationiOS - API 同步
【发布时间】:2015-02-10 13:13:14
【问题描述】:

我正在 iOS 中构建一个玩具应用程序,用户可以:

  • 创建任务,存储在本地
  • 这些任务将同步到服务器
  • 在网页中创建任务
  • 它们将被同步回应用程序

所有这些都使用 Core Data 进行持久化,使用 Alamofire 进行网络,使用 Swift 编码。

我通常为此流程做的如下:

  1. 上传新任务
  2. 从上游下载更改
  3. 同步本地编辑的任务

这要求所有这些任务都串行执行,但 Alamofire 显然不执行同步请求。我是 iOS 编程新手,我已经阅读了一些关于 GCD 的内容,但我不确定我应该如何继续。

用直截了当的问题来解决这个问题:

  1. 同步流程正确吗?
  2. 我应该使用 GCD 吗?如果有,怎么做?
  3. 有关如何正确执行此操作的任何建议?

【问题讨论】:

    标签: ios swift core-data grand-central-dispatch alamofire


    【解决方案1】:

    这就是我的做法(假设您可以更改服务器的代码):

    首先,在应用中的某处存储一个本地“同步日期”。然后,对于每个任务,存储修改日期。每当修改任务时,将修改日期设置为当前日期。那么当你想与服务器同步时:

    1. 将“同步日期”之后修改的所有任务上传到服务器。另外,将“同步日期”发送到服务器。
    2. 服务器响应所有修改日期在指定同步日期之后的任务。
    3. 然后服务器会检查上传的项目并保存它们。
    4. 然后应用程序会保存从服务器下载的所有任务,根据需要创建新任务或更新现有任务...
    5. 然后应用程序会检查从服务器返回的所有项目,寻找最新的修改日期。如果最新修改日期晚于应用的“同步日期”,则将“同步日期”设置为最新修改日期。

    对于删除任务,我会在每个任务上设置一个“已删除”标志。当一个任务被删除时,它的“deleted”标志被设置为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。更好的是,根本不使用时间戳,而是使用一些服务器生成的唯一标识符(例如复制 id,或者你有什么)。这完全消除了微小时差等风险。
    • 伟大的模式。 @Rob,关于复制 ID 的任何进一步阅读?听起来很有趣
    • 这个想法相当简单。让服务器跟踪更新的顺序,通过更改/修改/删除日期、一些唯一标识符或一些序列号来识别它们。有时您会在表格中正确执行此操作。有时你会有一个单独的更新表(有时由原始表上的触发器填充)。但是,无论您使用什么标识符,都让客户端跟踪它从服务器接收到的最后一个标识符,并在将来某个时间点请求其他更新时将相同的标识符传递回服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多