从列出的Plist加载NSDictionary

时间:2013-01-16 11:17:03

标签: ios objective-c plist nsdictionary

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

这里我是如何加载plist文件的:

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

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

有办法搞清楚吗? 提前谢谢。

3 个答案:

答案 0 :(得分:4)

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

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

或者,考虑在plist的根目录中使用Array,其中包含城市词典的有序列表。然后,如果迭代其中包含的数组,它们将按照plist中包含的数组顺序进行。

答案 1 :(得分:1)

NSDictionary不是有序的数据结构。

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

请参阅Apple文档了解allKeys函数。

  
    

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

         
        
  • (NSArray *)allKeys
  •     
  
     

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

     
    

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

  

答案 2 :(得分:0)

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

cities{
  list[
    city{}
    city{}
    city{}
    ...
  ]
}