ios - 在 iOS 中高效同步数据

标签 ios grand-central-dispatch

我正在开发应用程序,当应用程序进入后台并且应用程序变为事件状态时,我将数据同步到服务器或从服务器同步数据。因为当我同步到多个设备时,数据应该在所有设备上更新。

下面是我的做法,

- (void)applicationDidBecomeActive:(UIApplication *)application
{
     if([[AppManager instance].globalManager activeSyncCounter] == 0)
     {
           [_webService callServerAPI];         
     }
}


- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if([[AppManager instance].globalManager activeSyncCounter] == 0)
     {
           [_webService callServerAPI];         
     }
}

让我解释一下上面的代码

1) 我正在调用 API 来同步我的数据,我迭代 for 循环来同步我的数据并将其发送到服务器。(所有调用都是异步的)

2)如您所见,我使用了activeSyncCounter。我使用它是因为,用户可以立即打开和退出应用程序,这样服务器 API 就不会再次调用,直到第一个完成为止。

现在这是我的疑惑。

1)首先,当我收到服务器的响应时,当数据较多时,需要花费一些时间通过for循环进行更新,并且我的UI变得无响应。 因此,为了改进这一点,我需要在调度队列中运行 for 循环代码。 或者他们还有其他更好的方法吗?

另外,更新完成后,当应用程序进入后台时,那么应用程序进入后台时是否需要调度队列?

2)其次,他们是否有使用 activeSyncCounter

的替代方案

最佳答案

您(几乎)永远不想在主线程上执行任何同步 I/O 操作(包括网络操作),所以对于您的第一个问题,是的,您应该使用异步网络 API 或将同步操作移至不同的线程线程——调度队列是实现这一点的一种方法。

关于你的第二个问题,我不知道是否存在绝对“更好”的方法,但有不同的方法。我可能建议的一件事是将该检查移动到 callServerAPI 中,以简化调用该方法的代码。 (即一次编写检查代码,而不是在任何地方调用服务器 API。)

关于ios - 在 iOS 中高效同步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28216547/

相关文章:

ios - iphone 上的 SQLite "near"语法错误

ios - 开始游戏时停止背景音乐

ios - 如何使用 Swift 将 viewcontroller 推送到导航堆栈?

ios - Xcode 5关闭图标光泽效果的方法

ios - 澄清dispatch_queue,重入和死锁

ios - UI(有时)在 iOS 上的操作期间卡住

ios - dispatch_queue_set_specific 与获取当前队列

ios - 使用排除路径计算 TextView 的单元格高度

Swift 调度队列异步执行顺序

ios - 应用程序 :didFinishLaunchesWithOptions: 中的长时间运行任务