Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-API同步_Ios_Swift_Core Data_Grand Central Dispatch_Alamofire - Fatal编程技术网

iOS-API同步

iOS-API同步,ios,swift,core-data,grand-central-dispatch,alamofire,Ios,Swift,Core Data,Grand Central Dispatch,Alamofire,我正在iOS中构建一个玩具应用程序,用户可以: 创建本地存储的任务 这些任务将同步到服务器 在网页中创建任务 它们将被同步回应用程序 所有这些都使用核心数据进行持久化,使用Alamofire进行联网,并以Swift编码 我通常对此流程执行以下操作: 上载新任务 从上游下载更改 同步本地编辑的任务 这要求所有这些任务都以串行方式执行,但Alamofire显然不执行同步请求。我对iOS编程还不熟悉,我读过一些关于GCD的书,但我不确定该如何继续 要用直截了当的问题来澄清这一点: 同步流正确吗 我

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

  • 创建本地存储的任务
  • 这些任务将同步到服务器
  • 在网页中创建任务
  • 它们将被同步回应用程序
所有这些都使用核心数据进行持久化,使用Alamofire进行联网,并以Swift编码

我通常对此流程执行以下操作:

  • 上载新任务
  • 从上游下载更改
  • 同步本地编辑的任务
  • 这要求所有这些任务都以串行方式执行,但Alamofire显然不执行同步请求。我对iOS编程还不熟悉,我读过一些关于GCD的书,但我不确定该如何继续

    要用直截了当的问题来澄清这一点:

  • 同步流正确吗
  • 我应该使用GCD吗?如果是,怎么做
  • 关于如何正确地做到这一点,有什么建议吗
  • 我将这样做(假设您可以更改服务器的代码):

    首先,在应用程序的某个地方存储一个本地“同步日期”。然后,为每个任务存储一个修改的日期。每当修改任务时,将修改日期设置为当前日期。然后,当您要与服务器同步时:

  • 将“同步日期”后修改的所有任务上载到服务器。另外,将“同步日期”发送到服务器
  • 服务器响应修改日期在指定同步日期之后的所有任务
  • 然后,服务器检查上传的项目并保存它们
  • 然后应用程序保存从服务器下载的所有任务,根据需要创建新任务或更新现有任务
  • 然后,应用程序会检查从服务器返回的所有项目,查找最新的修改日期。如果最新修改日期晚于应用程序的“同步日期”,则将“同步日期”设置为最新修改日期
  • 对于删除任务,我在每个任务上都有一个“已删除”标志。当任务被删除时,它的“已删除”标志设置为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?听起来很有趣。这个想法相当简单。让服务器跟踪更新序列,通过更改/修改/删除日期、某些唯一标识符或某些序列号来识别它们。有时有时候你会有一个单独的表,其中只包含更新(有时候会在原始表上填充触发器)。但是,无论您使用什么标识符,都要让客户端跟踪它从服务器接收到的最后一个标识符,并在将来某个时候请求其他更新时将该标识符传递回服务器。