swift - Core Data 和 CloudKit 同步不一致
问题描述
我有一个使用公共数据库使用 Core Data 和 CloudKit 的应用程序。问题是删除似乎永远不会同步,添加和更改直到应用程序进入后台然后返回前台才会显示,甚至这些结果也不一致。
示例应用程序只是您在指定 SwiftUI 和 Core Data 时获得的默认应用程序。我在 CloudKit 仪表板中修改了 Schema,添加了两个索引 recordName 和 modifiedAt。
下面是 Persistence.swift 文件,所以要重现,新建一个项目,选择 Core Data 和 Use CloudKit,Add Capability for CloudKit 和 Remote Notifications,然后将 Persistence.swift 的内容替换为上面的内容。
import CoreData
struct PersistenceController {
static let shared = PersistenceController()
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
for _ in 0..<10 {
let newItem = Item(context: viewContext)
newItem.timestamp = Date()
}
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
return result
}()
let container: NSPersistentCloudKitContainer
init(inMemory: Bool = false) {
container = NSPersistentCloudKitContainer(name: "TestCKSink")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
guard let description = container.persistentStoreDescriptions.first else
{
fatalError()
}
//description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
description.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
description.cloudKitContainerOptions?.databaseScope = .public
container.viewContext.transactionAuthor = "Me"
container.viewContext.automaticallyMergesChangesFromParent = true
container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
}
}
我已经尝试过启用和不启用历史跟踪选项。正如我所说,这在某些时候有效。我也意识到我需要添加代码来强制刷新显示,但即使检查 CloudKit 仪表板并查询记录,有些根本没有显示在那里或需要很长时间才能到达(18 分钟)。
任何建议都会受到欢迎。
解决方案
我前段时间遇到过类似的问题,在初始化托管对象上下文时尝试以下设置:
managedObjectContext.automaticallyMergesChangesFromParent = true
推荐阅读
- javascript - 获取 Google Picker api 的开发者 API 密钥
- sql - SQL Server 中的多维数据集是什么?
- python - 根据条件从熊猫系列中删除重复项
- swift - 如何以编程方式滚动 iOS WKWebView,swift 4
- h2 - Ignite Query / SqlQuery / SqlFieldsQuery:“惰性”和“页面大小”实际上在做什么?
- opentok - OpenTok CreateSession“请求提交错误”
- angular6 - Angular 6 - 无法将标头添加到 httpClient (httpClient - @angular/common/http)
- java - 向我的 Spring Boot 项目添加新的依赖项会破坏现有的 @Autowired 设置
- ios - reloadData后无法单击tableView单元格中的按钮
- coldfusion - 在 ColdFusion 中将结构创建为按钮