我正在构建一个类似于Apple的Notes应用程序的简单应用程序,我的应用程序使用CoreData和CloudKit。 目前,我遇到了几个与CloudKit网络可用性相关的问题。
当网络可用时,一切顺利,CoreData保存笔记,CloudKit也使用 CKModifyRecordsOperation 。但是,当网络不存在时,应用程序会以某种方式保持离线时发送的操作,并在应用程序上线时将其推送到云端。但是,只有当我创建另一个操作并添加到队列时,它才会在应用程序变为活动时自动执行(我将应用程序从后台带到活动模式并等待5分钟,没有任何反应。只有当我排队另一个操作,然后发送所有待处理的操作)
我的问题是,如何在不创建其他操作的情况下触发应用程序发送所有待处理操作?
当然,如果用户没有杀死应用程序(双主页按钮然后轻扫),则可以进行上述操作。如何处理这种情况?当离线时创建的记录很少,然后应用程序被杀死。
我想过标记已成功同步的CoreData中的每条记录,然后每次启动应用程序时,请浏览那些未同步并同步它们的记录。
这是正确的方法吗?或苹果已经有更好的方法来解决这个问题,我仍然找不到它?
答案 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)
})
}
})