在iOS8上将所有数据存储在App Groups的容器区域中是否有任何弱点?

mon*_*ono 2 ios ios8 ios-app-extension ios-app-group

我正在考虑将所有数据存储在应用程序组的容器区域中,以创建支持 AppExtensions 的应用程序。

在iOS8上将所有数据存储在App Groups的容器区域中是否有任何弱点?我应该在应用程序组的容器区域中存储有限的数据吗?

应用扩展编程指南:处理常见场景

Dan*_*sko 5

当然,这取决于您的应用程序,但这是我的两分钱:

将所有信息存储在共享目录中完全是多余的,而且听起来不像是来自任何合理的推理。如果您认为您的小部件需要您的应用程序所需的所有信息,那么您可能需要重新考虑小部件的复杂性。

通过这种方式,您获得的是便利(未来您会感到头疼)而不是简单(通过单一责任隐藏复杂性)。需要注意的是,随着应用程序的增长并变得更加复杂,您最终将花费更多的时间来促进应用程序容器(大型视图控制器)内部的信息。你想要争取的是单一的责任。相反,您现在需要一个对象来方便将两个应用程序的信息放入一个容器中。

共享容器也与应用程序沙箱不同,因为您需要担心协调读取和写入。这就是为什么通常最好继续使用 Core Data 或 NSUserDefaults(使用套件名称实例化)。如果您的应用程序存储图像和其他内容,那么您将陷入痛苦的世界。甚至Apple也推荐用户默认值(因为这是他们给出的唯一示例)或 CoreData:

启用应用程序组后,应用程序扩展及其包含的应用程序都可以使用 NSUserDefaults API 共享对用户首选项的访问权限 [...] 为了避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 Posix 锁来帮助协调共享容器中的数据访问。

小部件的目的是提供应用程序的即时概述。通过最大限度地减少小部件可以访问的数据量,您将减少许多麻烦,并使您的小部件更好地包含在内。请记住,能力越大,责任越大,如果您认为将所有信息存储在一个共享容器中,那么您需要承担很多责任......

例子

我最近完成了为新闻应用程序构建一个小部件,该应用程序显示热门新闻报道以及个性化小部件显示的内容的能力。以下是数据持久性的基本细分,以便您了解:

存储细分

小工具

  • 当前显示的图像
  • JSON Feed 的上次修改日期(因此我们知道何时告诉小部件已添加新内容)

应用程序

  • 所有故事、图像和用户内容等

共享容器

  • 用户选择的主题
  • 热门故事列表

当小部件被要求获取内容时,它会下载一个 JSON 文件,其中包含所有主题的热门新闻。此 JSON 会持久保存到共享容器中。我们存储所有故事的原因是,如果用户更改了他们最喜欢的主题,则小部件可以在存储所有主题时简单地更新其选择。这还允许应用程序更新头条新闻和小部件以立即反映这一点。

然后,该小部件将提取与用户指定的主题标签匹配的 3 个热门故事。这些热门主题保留在共享用户默认项中。当然,小部件有可能在用户选择主题之前打开,在这种情况下,小部件将自动选择前三个左右的主题。

长话短说

打个比方——如果 Widget 和 App 是工作场所的同事,那么 Shared Container 就像一台电脑。您每天与某人在同一台计算机上工作的效率如何?