2

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

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

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

4

1 回答 1

5

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

将所有信息存储在共享目录中完全是矫枉过正,听起来不像是出于任何合理的推理。如果您觉得您的小部件需要您的应用程序所需的所有信息,那么您可能需要重新考虑小部件的复杂性。

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

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

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

小部件的目的是提供应用程序的即时概览。通过最小化小部件可以访问的数据量,您将减少许多令人头疼的问题,并使您的小部件更好地包含。请记住,强大的力量伴随着巨大的责任,如果您认为将所有信息存储在一个共享容器中,那么您需要承担很多责任......

例子

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

存储细分

小部件

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

应用程序

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

共享容器

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

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

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

TL;博士

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

于 2015-01-29T11:38:08.930 回答