【问题标题】:How to persist a NSMutableArray如何持久化 NSMutableArray
【发布时间】:2014-01-31 02:20:16
【问题描述】:

我是 iOS 开发的新手。 我从Apple dev website 上非常有用的教程开始

所以我按照说明制作了简单的待办事项列表应用程序。

应用程序:这是一个简单的待办事项列表。它有一个带有单个文本字段的视图,它接受一个输入,然后将该输入附加到表列表视图中。表格列表视图是我的“待办事项列表”,它是从 NSMutableArray 生成的。

问题:每当我退出并重新启动应用程序时,我的列表就会消失。

问题:我需要一种方法来持久化存储我的列表的NSMutableArray *ToDoList

那么可以保留列表吗?还是我必须使用某种数据存储? 在询问并阅读有关将列表存储在“NSUserDefaults”中的一些内容之前,我做了一些研究 - 但问题是 NsUserDefaults 只返回一个 im-mutable Object

结论:

  1. 我们可以持久化 NsMutable 列表吗?如果是怎么办?

  2. 是否需要使用 NSUserDefaults?为什么?

  3. 如果 (2) 为是,那么如何使返回的 NsUserDefaults 的不可变对象可变?

我要再次告诉你,我唯一掌握的 iOS 开发人员来自教程。所以如果你把它分解成最简单的形式,我会很高兴的。

谢谢。

【问题讨论】:

  • NSMutableArray *array = [[[NSUserDefaults standardUserDefaults]objectForKey:@"key"]mutableCopy]
  • 我反对使用 NSUserDefaults,因为待办事项列表会在您的应用程序中扩展,并且您可能希望对这些对象执行多项操作。每次从 userDefaults 获取数据对我来说似乎都不是好方法。
  • 核心数据。立即学习 - 以后您会感激不尽的。

标签: ios iphone objective-c nsmutablearray persistent-storage


【解决方案1】:

您最好选择 CoreData。它非常易于实施且非常好用。

这里是 best tutorial 开始使用

这里是Core Data programming guide from apple

这里是why you should go for Core-Data

尽管有所有其他意见,我还是建议您仅使用核心数据。 XCode 中提供的可视化界面和大量出色的开发支持似乎太容易了。

我反对使用 NSUserDefaults,因为待办事项列表应该在您的应用程序中扩展,并且您可能希望对这些对象执行多个操作。每次从 userDefaults 获取数据对我来说似乎都不是好方法。

为什么使用 NSUserDefaults:

NSUserDefaults 类提供了一个与默认系统交互的编程接口。默认系统允许应用程序自定义其行为以匹配用户的偏好。例如,您可以允许用户确定应用程序显示的测量单位或自动保存文档的频率。应用程序通过将值分配给用户默认数据库中的一组参数来记录此类偏好。这些参数被称为默认值,因为它们通常用于确定应用程序在启动时的默认状态或默认行为方式。

这里是Class Reference

【讨论】:

  • 这正是我的想法。待办事项列表会扩展,每次保存和检索它似乎是一个错误的概念。我想提出另一个意见,NSUserDefaults 到底是做什么用的?
  • 如果您想保留一些基于用户的设置,您应该使用 NSUserDefaults,这些设置更改频率较低,而且它们也不应该是庞大的。
  • @Leo 我在回答中添加了有关 NSUserDefaults 的更多信息。如果您同意这些观点,请随时接受/支持答案。如果需要更多信息,请告诉我。干杯:)
  • 另一个优势 - Core Data 允许您存储自定义对象,而您只能将 plist-able 对象存储在 NSUserDefaults 或磁盘上的 plist 中。
【解决方案2】:

1) 如果您只想保存NSMutableArray,那么可以,您可以使用NSUserDefaults

2) 如果您不想处理 Core Data 并设置适当的数据结构,那么这似乎是唯一的选择。

3) 当您从NSArray *array 获得NSMutableArray 时,只需使用[array mutableCopy]

【讨论】:

  • 这不是唯一的选择,您可以将数组写入 plist,只要该数组仅包含 plist-able 对象即可。或者,您可以使您的自定义对象符合 NSCoding 并使用 archiveDataWithRootObject: 将数组保存到磁盘上的文件中。
【解决方案3】:

简短的回答是使用 NSArray 的 writeToURL:atomically: 和 arrayWithContentsOfURL: 方法将数组写入磁盘上的文件并从磁盘上的文件中读取数组。更长的答案将证明这可能是合理的......现在我将跳到答案:“到'〜/ Library / Application Support /'文件夹中(您的应用程序独有)文件夹中的文件。(注意:我我是一名 OSX 程序员……iOS 应用程序可能有更好的地方……;-) 下面是代码:

NSArray * array;    // <<== this is your array (I assume you've created it somewhere…)

// get the document directory URL
NSURL *documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentsDirectory inDomains:NSUserDomainMask] firstObject];


// append our file name
NSURL *url = [documentDirectoryURL URLByAppendingPathComponent:@"ToDo.data" isDirectory:NO];

#if WRITING_ARRAY
    // write our array to the file
    if (![array writeToURL:url atomically:YES]) {
        NSLog(@"Failed to writeToURL:'%@'", url);
    }
#else // READING_ARRAY
    // read (mutable) array from file
    array = [[NSArray arrayWithContentsOfURL:url] mutableCopy];
#endif

【讨论】:

  • 我已将其编辑为更适合 iOS 应用程序。
  • 我正在使用上面的代码来存储 NSMutableArray,当我尝试从 .data 文件中检索数据时,我得到了 nil。
  • Kunal Shrivastava:检查您的控制台以查看 writeToURL 是否发布了任何失败消息。只是在 writeToURL 之后立即仔细检查 arrayWithContentsOfURL 并将读取的内容与写入的内容进行比较。显然,它们应该是相同的;如果不是,请检查控制台是否有错误消息。
【解决方案4】:

你最好使用Core Data,或者像FMDB这样的其他持久化方式。使用NSUserDefaults 可以,但NSUserDefaults 的性能真的很差。您可以使用NSUserDefaults 进行演示,但对于最终应用,强烈建议使用更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 2013-09-17
    • 2010-09-29
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多