在 iOS8 中的 App 和 Extension 之间共享 Core Data 堆栈和数据

Posted

技术标签:

【中文标题】在 iOS8 中的 App 和 Extension 之间共享 Core Data 堆栈和数据【英文标题】:Sharing a Core Data stack and data between App and Extension in iOS8 【发布时间】:2014-11-17 18:49:10 【问题描述】:

我创建了一个framework 在应用程序和扩展程序之间共享我的数据对象。这包括数据模型和带有我的Core Data db 的 sqlite 文件。

我担心如果 App 和 Extension 都尝试访问这个共享的 sqlite db 会发生什么。

如果应用程序在后台对数据库进行一些更改,而扩展程序正在使用它,会出现什么问题?

在这种情况下,最佳做法是什么?

【问题讨论】:

这是FAQ。 【参考方案1】:

正如@CL 所指出的,SQLite 对此很好。但是你没有直接使用 SQLite,所以你可能需要做一些核心数据级别的工作来保持一致性。使用 ios 应用程序和扩展程序,您有两个独立的进程可以更改数据。您的代码需要考虑到这一点。

如果您的应用扩展程序只显示数据(例如,仅显示应用程序中创建的数据的“今日”扩展程序),您可能不需要做任何特别的事情。如果您的应用程序在后台运行并在扩展程序可见时创建新数据,则扩展程序的数据可能会稍微过时。如果这很重要,您可以刷新它。但是今天的扩展通常不会很长时间可见,所以它可能不值得。在这种情况下,我会在设置扩展的核心数据堆栈时使用NSReadOnlyPersistentStoreOption,以明确意图并防止无意更改。

如果您的应用扩展程序创建新数据或修改现有数据,您的应用程序需要意识到这一点并做出适当的响应。您将进行哪些更改将取决于扩展程序如何准确地处理共享数据。对于修改后的数据,您的应用程序可能需要在任何内存管理对象上调用 refreshObject:mergeChanges:,并将 NO 作为第二个参数。它还可能需要重做更改可能影响搜索谓词的任何提取。这将确保您获得最新的更新。对于新数据,您需要重新获取应用程序正在使用的任何数据以获取新的添加/删除。检查的好时机是应用程序何时出现在前台(即当UIApplicationWillEnterForegroundNotification 发布时)。

【讨论】:

你能看看这个问题吗?我想你可能知道答案:***.com/questions/41493510/…

以上是关于在 iOS8 中的 App 和 Extension 之间共享 Core Data 堆栈和数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS扩展Extension之Today

Xcode 在调试/运行 iOS8 App Today Extension 时将多个包含的应用程序安装到设备上

编译包含 iOS 8 App Extension 的 Xcode 项目时生成错误

如何消除 ios8 Todays Extension 中的领先差距

App Today Extension开发注意事项

iOS ---Extension编程指南