没有文档或示例代码说明我们是否可以与app扩展程序共享viewContext。
AFAK,应用和扩展程序在不同的进程中运行,我们不应该与另一个进程/线程共享moc。我不应该分享包含应用程序正在使用appView扩展名的viewContext。
我们应该创建另一个在app扩展中使用的viewContext(?但是NSPersistentContainer只提供一个viewContext)或在app扩展中使用背景上下文(???)
当扩展程序正在运行时,它只与主机应用程序直接通信。正在运行的扩展程序与其包含的应用程序之间没有直接通信;通常,包含应用程序在其扩展程序运行时甚至没有运行。此外,包含应用程序和主机应用程序根本不进行通信。
因为它们都在不同的进程中运行,所以也许(???)我可以得出结论,当app扩展请求viewContext时,当包含应用程序请求viewContext时,2 viewContext(s) )实际上是不同的实例吗?
class Master {
static let shared: Master = Master()
lazy var persistentContainer: CCPersistentContainer = {
let container = CCPersistentContainer(name: "xt")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
private var _backgroundContext: NSManagedObjectContext!
var backgroundContext: NSManagedObjectContext {
if _backgroundContext == nil {
_backgroundContext = persistentContainer.newBackgroundContext()
}
return _backgroundContext
}
var viewContext: NSManagedObjectContext {
return persistentContainer.viewContext
}
func saveContext() {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
}
----更多关于如何跨进程同步数据----
1。 WWDC 15:224_hd_app_extension_best_practices
此WWDC会话讨论如何发布通知x进程。
2。 NSMergePolicy
用于解决托管对象的持久存储和内存中版本之间冲突的策略对象。
第3。 WWDC 17:210_hd_whats_new_in_core_data
4。 UserDefaults(suiteName:AppGroups.primary)!
答案 0 :(得分:1)
您无法在应用和扩展程序之间共享viewContext
。我并不是说你不应该,我的意思是它实际上,即使你想这样做也几乎不可能。应用程序及其扩展是两个独立的过程。 viewContext
对象在运行时由进程创建。应用程序无法将内存中的变量移交给iOS上的其他进程,因此不可能在两者中使用相同的实例。您还有两个不同的持久性容器对象,这也是因为它们是在应用程序或扩展程序运行时创建的。
这两个容器或视图上下文可能使用相同的持久存储文件。这并不罕见,它允许应用和扩展程序访问相同的数据。