gpt4 book ai didi

swift - NSPersistentCloudKitContainer:与 App Extension 共享单个数据库

转载 作者:行者123 更新时间:2023-12-04 04:01:28 24 4
gpt4 key购买 nike

我知道这是一个常见问题,也许之前已经问过很多次了。我还知道如何通过启用应用程序组使用核心数据与应用程序扩展共享单个数据库。我现在正在使用 NSPersistentCloudKitContainer 同步数据(跨 iCloud 设备),效果很好。

但我想与我的应用程序扩展(今天的扩展)共享我的数据库,此时应用程序组将不再有帮助,因为它们是 Apple 描述的不同技术。因此,我只是从签名和功能 Pane 中为容器应用程序和应用程序扩展启用了 iCloud。然后我可以从两个应用程序容器/扩展访问我的单一数据库,如下所示:

// MARK: - Core Data stack, Shared database
lazy var persistentContainer: NSPersistentCloudKitContainer = {
let container = NSPersistentCloudKitContainer(name: "MyApp")

// Spotlight search support and history tracking
container.persistentStoreDescriptions.forEach {
$0.setOption(CoreDataSpotlightSearchDelegate.init(forStoreWith: $0, model: container.managedObjectModel), forKey: NSCoreDataCoreSpotlightExporter)
$0.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}

// Load persistent store
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})

container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
container.viewContext.automaticallyMergesChangesFromParent = true

return container
}()

但是它仅在设备在线时有效(这是预期的行为),所以我的问题是:

是否可以在设备离线时使用 NSPersistentCloudKitContainer 在应用程序和扩展程序之间共享我的数据库?一些解决方法?

编辑

这是一个非工作版本,我可以访问相同的数据库但没有云同步(未出现在 CloudKit 仪表板上):

 // MARK: - Core Data stack, Shared database
lazy var persistentContainer: NSPersistentCloudKitContainer = {
let container = NSPersistentCloudKitContainer(name: "MyApp")

// Shared container support
if let url = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.company.MyApp")?.appendingPathComponent("MyApp.sqlite") {
let persistentStoreDescription = NSPersistentStoreDescription.init(url: url)
container.persistentStoreDescriptions = [persistentStoreDescription]
}

// Spotlight search support and history tracking
container.persistentStoreDescriptions.forEach {
$0.setOption(CoreDataSpotlightSearchDelegate.init(forStoreWith: $0, model: container.managedObjectModel), forKey: NSCoreDataCoreSpotlightExporter)
}

// Load persistent store
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})

container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
container.viewContext.automaticallyMergesChangesFromParent = true

return container
}()

最佳答案

要在应用程序和扩展程序之间共享数据库,您需要完全实现持久性历史记录跟踪;它不像启用商店选项那么简单。有关该功能的介绍,请参阅 WWDC 2017 What's New in Core Data在 20:49 并查看文档 Consuming Relevant Store Changes特别是“将相关事务合并到上下文中”。

关于为什么您在使用 NSPersistentCloudKitContainer 时没有注意到问题的理论是,当您的商店在线并与云同步时,您正在受益于云同步运行的副作用您的应用进程和在恢复时编辑商店,这反过来又导致您的上下文得到更新。

顺便说一句,NSPersistentHistoryTrackingKey 选项默认设置为 NSPersistentCloudKitContainer 的商店描述有 cloudKitContainerOptions 就像默认的第一个商店说明有。

关于swift - NSPersistentCloudKitContainer:与 App Extension 共享单个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63008735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com