如何使用 CoreData 和 CloudKit 处理离线模式?
How to handle offline mode with CoreData and CloudKit?
我正在构建一个类似于 Apple Notes 应用程序的简单应用程序,我的应用程序使用 CoreData 和 CloudKit。
目前,我遇到了一些与 CloudKit 的网络可用性相关的问题。
当网络可用时,一切顺利,CoreData 保存笔记,CloudKit 也使用 CKModifyRecordsOperation 保存笔记。然而,当网络不存在时,应用程序会以某种方式在离线时保持发送的操作,并在应用程序上线时将它们推送到云端。但是,它只在我创建另一个操作并添加到队列时才执行,当应用程序激活时它不会自动执行 (我将应用程序从后台切换到活动模式并等待 5 分钟,没有任何反应。只有当我排队另一个操作时,所有未决操作也被发送)
我的问题是,如何在不创建另一个操作的情况下触发应用程序发送所有待处理的操作?
当然,如果用户没有关闭应用程序(双击主页按钮然后滑动离开),上述情况是可能的。如何处理这种情况?当离线时创建的记录很少,然后应用程序被杀死。
我想标记 CoreData 中成功同步的每条记录,然后每次应用程序启动时,检查那些未同步的记录并同步它们。
这样做对吗?或者 Apple 已经有更好的方法来处理这个问题,但我仍然找不到?
您绝对可以为每个对象保留一个布尔值以将其标记为不同步,然后在启动时或连接恢复时尝试同步。
否则,是否会在您的应用进入后台之前调用 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)
})
}
})
我正在构建一个类似于 Apple Notes 应用程序的简单应用程序,我的应用程序使用 CoreData 和 CloudKit。 目前,我遇到了一些与 CloudKit 的网络可用性相关的问题。
当网络可用时,一切顺利,CoreData 保存笔记,CloudKit 也使用 CKModifyRecordsOperation 保存笔记。然而,当网络不存在时,应用程序会以某种方式在离线时保持发送的操作,并在应用程序上线时将它们推送到云端。但是,它只在我创建另一个操作并添加到队列时才执行,当应用程序激活时它不会自动执行 (我将应用程序从后台切换到活动模式并等待 5 分钟,没有任何反应。只有当我排队另一个操作时,所有未决操作也被发送)
我的问题是,如何在不创建另一个操作的情况下触发应用程序发送所有待处理的操作?
当然,如果用户没有关闭应用程序(双击主页按钮然后滑动离开),上述情况是可能的。如何处理这种情况?当离线时创建的记录很少,然后应用程序被杀死。
我想标记 CoreData 中成功同步的每条记录,然后每次应用程序启动时,检查那些未同步的记录并同步它们。
这样做对吗?或者 Apple 已经有更好的方法来处理这个问题,但我仍然找不到?
您绝对可以为每个对象保留一个布尔值以将其标记为不同步,然后在启动时或连接恢复时尝试同步。
否则,是否会在您的应用进入后台之前调用 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)
})
}
})