iOS - API 同步
iOS - API Synchronization
我正在 iOS 开发一个玩具应用,用户可以:
- 创建任务,存储在本地
- 这些任务将同步到服务器
- 在网页中创建任务
- 它们将同步回应用程序
所有这些都使用 Core Data 实现持久化,使用 Alamofire 实现网络,编码为 Swift。
我通常为这个流程做的是:
- 上传新任务
- 从上游下载更改
- 同步本地编辑的任务
这需要串行执行所有这些任务,但 Alamofire 显然不执行同步请求。我是 iOS 编程的新手,我已经阅读了一些关于 GCD 的内容,但我不确定我应该如何继续。
用直截了当的问题来解决这个问题:
- 同步流程是否正确?
- 我应该使用 GCD 吗?如果是,怎么做?
- 关于如何正确执行此操作的任何建议?
这就是我的做法(假设您可以更改服务器代码):
首先,将本地 "sync date" 存储在应用程序的某个位置。然后,对于每个任务,存储一个修改日期。每当修改任务时,将修改日期设置为当前日期。然后当你想与服务器同步时:
- 将"sync date"之后修改的所有任务上传到服务器。另外,将 "sync date" 发送到服务器。
- 服务器响应所有修改日期在指定同步日期之后的任务。
- 服务器然后检查上传的项目并保存它们。
- 然后应用程序保存从服务器下载的所有任务,根据需要创建新任务或更新现有任务...
- 该应用程序然后遍历从服务器返回的所有项目,寻找最新的修改日期。如果最新修改日期晚于应用程序的 "sync date",则将 "sync date" 设置为最新修改日期。
为了删除任务,我在每个任务上都有一个 "deleted" 标志。当一个任务被删除时,它的 "deleted" 标志被设置为 true。它仍然会同步到服务器,但是如果从服务器下载任务并设置了 "deleted" 标志,它应该从数据库中删除...
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...
});
它还有更多功能...
我正在 iOS 开发一个玩具应用,用户可以:
- 创建任务,存储在本地
- 这些任务将同步到服务器
- 在网页中创建任务
- 它们将同步回应用程序
所有这些都使用 Core Data 实现持久化,使用 Alamofire 实现网络,编码为 Swift。
我通常为这个流程做的是:
- 上传新任务
- 从上游下载更改
- 同步本地编辑的任务
这需要串行执行所有这些任务,但 Alamofire 显然不执行同步请求。我是 iOS 编程的新手,我已经阅读了一些关于 GCD 的内容,但我不确定我应该如何继续。
用直截了当的问题来解决这个问题:
- 同步流程是否正确?
- 我应该使用 GCD 吗?如果是,怎么做?
- 关于如何正确执行此操作的任何建议?
这就是我的做法(假设您可以更改服务器代码):
首先,将本地 "sync date" 存储在应用程序的某个位置。然后,对于每个任务,存储一个修改日期。每当修改任务时,将修改日期设置为当前日期。然后当你想与服务器同步时:
- 将"sync date"之后修改的所有任务上传到服务器。另外,将 "sync date" 发送到服务器。
- 服务器响应所有修改日期在指定同步日期之后的任务。
- 服务器然后检查上传的项目并保存它们。
- 然后应用程序保存从服务器下载的所有任务,根据需要创建新任务或更新现有任务...
- 该应用程序然后遍历从服务器返回的所有项目,寻找最新的修改日期。如果最新修改日期晚于应用程序的 "sync date",则将 "sync date" 设置为最新修改日期。
为了删除任务,我在每个任务上都有一个 "deleted" 标志。当一个任务被删除时,它的 "deleted" 标志被设置为 true。它仍然会同步到服务器,但是如果从服务器下载任务并设置了 "deleted" 标志,它应该从数据库中删除...
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...
});
它还有更多功能...