关于与主应用程序

时间:2017-07-21 13:23:15

标签: ios core-data nsmanagedobjectcontext

没有文档或示例代码说明我们是否可以与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)!

1 个答案:

答案 0 :(得分:1)

您无法在应用和扩展程序之间共享viewContext。我并不是说你不应该,我的意思是它实际上,即使你想这样做也几乎不可能。应用程序及其扩展是两个独立的过程。 viewContext对象在运行时由进程创建。应用程序无法将内存中的变量移交给iOS上的其他进程,因此不可能在两者中使用相同的实例。您还有两个不同的持久性容器对象,这也是因为它们是在应用程序或扩展程序运行时创建的。

这两个容器或视图上下文可能使用相同的持久存储文件。这并不罕见,它允许应用和扩展程序访问相同的数据。