【发布时间】:2017-07-21 13:23:14
【问题描述】:
没有说明我们是否可以与应用扩展共享 viewContext 的文档或示例代码。
AFAK,应用程序和扩展程序在不同的进程中运行,我们不应该与另一个进程/线程共享 moc。我不应该与应用扩展共享包含应用正在使用的 viewContext。
那么我们应该创建另一个 viewContext 以在应用扩展中使用(?但 NSPersistentContainer 只提供一个 viewContext)或在应用扩展中使用背景上下文(???)
当扩展程序运行时,它只与宿主应用程序直接通信。正在运行的扩展程序与其包含的应用程序之间没有直接通信;通常,包含应用程序甚至在其扩展程序运行时都没有运行。此外,包含应用程序和宿主应用程序根本不通信。
因此,由于它们都在不同的进程中运行,所以也许 (???) 我可以得出这样的结论:当应用扩展请求 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)!
【问题讨论】:
-
更好的方法是使用核心数据历史跟踪。
标签: ios core-data nsmanagedobjectcontext