iOS - 存储供 AppDelegate 和其他视图控制器使用的数据

iOS - Store data for use by AppDelegate and other View Controllers

我正在开发一个应用程序,该应用程序可以让用户登录并下载一些数据,例如朋友、某些位置等。这是在登录屏幕后显示的自定义选项卡栏控制器中完成的,数据是存储在数组中。任何其他视图控制器都有对该选项卡栏控制器的引用以获取它们自己的数据副本。

我在 App Delegate 中也有一个事件侦听器 运行 来更新一些用户数据,但我需要访问我在处理事件侦听器时已经获取的用户数据。如果应用程序是 运行,这很好,因为标签栏控制器已经加载,我可以 post 在 App Delegate 中发出通知并在标签栏控制器中处理它,但是当应用程序未加载时运行 那么显然没有处理通知的实例。

存储下载数据以供应用程序关闭时使用但事件处理程序可以访问它的最佳方式是什么?我想到了核心数据,但它会定期更新,所以这似乎有点过分,但我以前从未这样做过,所以这可能就是答案..

任何想法或经验教训都会很棒!

有几个存储数据的选项。一种简单的方法是将数据直接存储在磁盘上的 plist 中。使用以下代码将数据添加到字典或数组并保存:

//Read from file:
let documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let path = documents.stringByAppendingPathComponent("SavedFile")
if let yourData = NSDictionary(contentsOfFile: path) as? [String: AnyObject] { //Cast to correct type
    //Do stuff with the data
    }

//Write to disk:
let yourData = [String: AnyObject]() //Your data
let documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let path = documents.stringByAppendingPathComponent("FileToSave")
(yourData as NSDictionary).writeToFile(path, atomically: true)

使用 plist 非常适合小数据量,通常当您有一些自定义数据要存储在磁盘上时。在您的情况下,这可能就足够了。

如果您有更多数据,那么 Core Data 是一个非常好的选择。 Core Data 的一些好处是它在幕后管理了很多混乱,并且与 UITableViewController 集成得很好。我不会在这里对 Core Data 进行全面介绍,但简而言之,设置起来会多一些工作,并且当您拥有相同格式的多组数据时(例如 "news" object包含标题、副标题、正文、图片等,重复多次)。使用 Core Data 存储一个用户的数据可能不是最佳选择,但如果不知道您存储的是什么数据就很难说。

另一种选择是将数据存储在 NSUserDefaults 中,但这主要用于设置和非常小的数据,而不是用户朋友列表等(但这是可能的)。

在不知道您的确切数据结构的情况下很难确定,但根据描述,我会按照上面的代码所示将 plist 保存在磁盘上,因为您已经在数组中拥有数据。