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

Are there any weak points to store all data in App Groups' container area on iOS8?

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

所有数据存储在iOS8上的App Groups的容器区域有什么弱点吗? 我应该把有限的数据存储在应用组的容器区域吗?

App Extension Programming Guide: Handling Common Scenarios

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

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

你这样做的目的是方便(未来你会头疼)而不是简单(通过单一责任隐藏复杂性)。需要注意的是,随着您的应用程序的增长和变得越来越复杂,您最终将花费更多的时间来处理 App Container 内部的信息(a la massive view controller)。你要争取的是单一的责任。相反,您现在需要一个对象来方便将两个应用程序的信息整合到一个容器中。

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

After you enable app groups, an app extension and its containing app can both use the NSUserDefaults API to share access to user preferences [...] To avoid data corruption, you must synchronize data accesses. Use Core Data, SQLite, or Posix locks to help coordinate data access in a shared container.

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

例子

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

存储故障

小部件

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

应用程序

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

共享容器

  • 用户选择的主题
  • 头条新闻列表

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

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

TL;DR

打个比方——如果说一个Widget和一个App是职场同事,Shared Container就像一台电脑。如果您每天都在同一台计算机上与某人一起工作,您的工作效率会有多高?