如何使用CoreData和CloudKit处理离线模式?

时间:2018-01-13 07:42:44

标签: ios swift cloudkit

我正在构建一个类似于Apple的Notes应用程序的简单应用程序,我的应用程序使用CoreData和CloudKit。 目前,我遇到了几个与CloudKit网络可用性相关的问题。

当网络可用时,一切顺利,CoreData保存笔记,CloudKit也使用 CKModifyRecordsOperation 。但是,当网络不存在时,应用程序会以某种方式保持离线时发送的操作,并在应用程序上线时将其推送到云端。但是,只有当我创建另一个操作并添加到队列时,它才会在应用程序变为活动时自动执行(我将应用程序从后台带到活动模式并等待5分钟,没有任何反应。只有当我排队另一个操作,然后发送所有待处理的操作)

我的问题是,如何在不创建其他操作的情况下触发应用程序发送所有待处理操作?

当然,如果用户没有杀死应用程序(双主页按钮然后轻扫),则可以进行上述操作。如何处理这种情况?当离线时创建的记录很少,然后应用程序被杀死。

我想过标记已成功同步的CoreData中的每条记录,然后每次启动应用程序时,请浏览那些未同步并同步它们的记录。

这是正确的方法吗?或苹果已经有更好的方法来解决这个问题,我仍然找不到它?

1 个答案:

答案 0 :(得分:2)

你绝对可以为每个对象保留一个布尔值,将其标记为不同步,然后尝试在启动时或恢复连接时进行同步。

否则,在应用程序进入后台之前, longLivedOperationWasPersistedBlock 是否会被调用?如果不是,那表明您的操作没有被正确保留。

根据文档,当您的应用程序恢复时,您应该获取任何长期存在的操作并将它们添加到容器中:

container.fetchAllLongLivedOperationIDs(completionHandler: { (operationIDs, error) in
if let error = error {
    print("Error fetching long lived operations: \(error)")
    // Handle error
    return
}
guard let identifiers = operationIDs else { return }
for operationID in identifiers {
    container.fetchLongLivedOperation(withID: operationID, completionHandler: { (operation, error) in
        if let error = error {
            print("Error fetching operation: \(operationID)\n\(error)")
            // Handle error
            return
        }
        guard let operation = operation else { return }
        // Add callback handlers to operation
        container.add(operation)
    })
}

})