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

标签 ios ios8 ios-app-extension ios-app-group

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

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

App Extension Programming Guide: Handling Common Scenarios

最佳答案

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

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

您通过此实现的是便利( future 您会头疼)而不是简单(通过单一责任隐藏复杂性)。需要注意的是,随着您的应用程序的增长和变得越来越复杂,您最终将花费更多的时间来处理 App Container 内部的信息(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 Feed 的最后修改日期(因此我们知道何时告诉小部件已添加新内容)

应用

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

共享容器

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

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

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

长话短说

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

关于ios - 在 iOS8 上将所有数据存储在 App Groups 的容器区域中是否有任何弱点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205758/

相关文章:

objective-c - 在分离的...上呈现 View Controller - 有时

ios - Swift:值未加载到文本字段

ios - 检测自定义键盘扩展中的输入对象 View 类型

ios - 无法从阵列中获取正确的音频文件来播放

ios - 在没有 contentView 框架的情况下计算 UITableViewCell 高度的最佳方法

json - NSJSONSeralization.dataWithJSONObject 崩溃

ios - 从应用程序扩展链接到嵌入式框架

ios - 如何在主iOS应用与其共享扩展之间使用相同的经过身份验证的用户 token

php - Swift HTTP Post Request dataUsingEncoding 格式错误的字符串

ios - 当我第一次快速点击按钮时,按钮单击不适用于 UITapGestureRecognizer