具有应用程序扩展的核心数据并发

Core Data concurrency with app extensions

我正在开发一个应用程序扩展,需要与包含的应用程序共享数据。我创建了一个应用程序组并将主应用程序的核心数据存储移动到该文件夹​​。从扩展我可以创建托管对象上下文并将数据保存到商店,我也可以从包含的应用程序访问它。现在我有两个独立的应用程序访问同一个核心数据存储。对我来说,这听起来像是灾难的秘诀。我设置的是否足以将数据从扩展程序发送到包含的应用程序,还是我应该寻找其他方式?

在这种情况下,您将有两个完全独立的核心数据堆栈访问同一个持久存储文件。

假设您使用的是 SQLite,至少在数据完整性方面没有问题。 Core Data 使用 SQLite 事务来保存更改,并且 SQLite 可以处理使用同一文件的多个进程。两个进程都不会破坏对方的数据或弄乱文件。

必须处理在应用程序中保持数据最新的问题。例如,如果有人在应用 运行 时使用共享扩展创建新数据。在这种情况下,您不会得到类似 NSManagedObjectContextDidSaveNotification 的任何内容。您需要找到自己的方式来确保获得任何新的更新。

在许多情况下,您可以使这几乎是微不足道的——监听 UIApplicationDidBecomeActiveNotification,只要您的应用程序出现在前台,它就会被发布。当你得到它时,检查新数据的持久存储并加载它。

如果你想变得更优雅一点,你可以在应用程序和扩展之间使用类似 MMWormhole 的某种基于文件的 IPC。然后扩展程序可以明确通知应用程序有新数据,应用程序可以响应。

Tom Harrington 的回答非常有趣。但是我需要提到 MMWormhole。我发现 MMWormhole 使用 NSFileCoordinator 并且苹果告诉我:

Using file coordination in an app extension to access a container shared with its containing app may result in a deadlock in iOS versions 8.1.x and earlier.

Apple 关于安全保存操作的建议,您可以在此处阅读:

You can use CFPreferences, atomic safe save operations on flat files, or SQLite or Core Data to share data in a group container between multiple processes even if one is suspended mid transaction.

Here is the link to the Apple Technical Note TN2408.