从列出的 Plist 加载 NSDictionary

Posted

技术标签:

【中文标题】从列出的 Plist 加载 NSDictionary【英文标题】:Loading NSDictionary from Plist as Listed 【发布时间】:2013-01-16 11:17:02 【问题描述】:

我使用plist 来存储键值列表。当应用程序需要该列表时,尝试将列表加载到 NSDictionary。到这里为止一切都很好。

这里我如何加载 plist 文件:

NSString *myPlistFilePath = [[NSBundle mainBundle] pathForResource: @"cities" ofType: @"plist"];
cities = [NSDictionary dictionaryWithContentsOfFile: myPlistFilePath];

当我们查看时,citiesNSDictionary。然后我将所有列表键值推送到 TableView,不知何故它没有在 plist 文件中列出。随机排序。

有办法解决吗? 提前致谢。

【问题讨论】:

您找到解决方案了吗?我也遇到了同样的问题 【参考方案1】:

NSDictionary 不是有序集合,也就是说,它不保证以任何方式保持内容的顺序。它的唯一功能是从键映射到值。

如果您需要订购的内容,您可以使用例如keysSortedByValueUsingSelector 从 NSDictionary 中提取它,这将提取集合中的数据,按照您的标准对其进行排序并将其存储在(保留顺序的)NSArray 中。

或者,考虑在 plist 的根目录中使用一个数组,其中包含一个有序的城市字典列表。然后,如果您遍历其中包含的数组,它们将按照 plist 中包含的数组顺序。

【讨论】:

感谢您的开创性回答。【参考方案2】:

NSDictionary 不是有序的数据结构。

对象根据allKeys函数列出,键以未定义的方式列出。

查看苹果文档以了解allKeys 函数。

allKeys 返回一个包含字典键的新数组。

(NSArray *)allKeys

返回值 一个包含字典键的新数组,或者一个空的 如果字典没有条目,则为数组。

讨论数组中元素的顺序没有定义。

【讨论】:

感谢您的回答,那么您有什么建议按列表加载?【参考方案3】:

如果您希望避免使用选择器对键进行排序,请考虑在 plist 的根目录中使用 Array。然后,当您遍历数组时,将保留顺序。这运行 o(n),它比可能的最快排序算法短 log(n) 例如:

cities
  list[
    city
    city
    city
    ...
  ]

【讨论】:

以上是关于从列出的 Plist 加载 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

从 plist 错误 Swift 加载

从 plist 加载 NSMutableDictionary

从 plist 加载滚动视图

从 plist 加载的 iOS 静态 const 数组

如何将图像从 plist 加载到 UITableView?

从下载的 plist 中重新加载 UITableView 数据