2015-10-09 88 views
1

我试图找出通过大JSON文件中搜索斯威夫特2. JSON文件看起来像这样的最佳方式大JSON文件:搜索通过特定键值对

[ 
    { 
     "Name": "Tom", 
     "Job": "Plumber" 
    }, 
    { 
     "Name": "Bill", 
     "Job": "Electrician" 
    } 
] 

因此,基本上所有的键在字典中都是相同的,但对不同(或可能不同)。

我试图找到一个值等于在这种情况下“比尔”或“汤姆”,但我不知道这些个人在数组中的索引。

我目前正在使用增量for循环来增加数组的索引,并在for循环中使用if语句来查看是否有键:“Name”有一对==“Bill”或“汤姆”或任何人。

代码我有工作,但由于json文件是非常长的,它需要永远解析数据并得到结果。有没有更快的方法来做到这一点?我不确定是否值得一提,但我在项目中使用了SwiftyJSON和Alamofire。

谢谢!

回答

0

你可以简化你的代码,但减少工作量并不那么简单。如果您有一个大的无序列表,您需要对其进行扫描,直到找到匹配项。每个条目都需要字符串比较,速度很慢。如果数组已排序,则可以使用binary search更快地找到答案。所以如果你期望你需要经常搜索这个列表,那么首先排序它可能是一个好主意。如果您的清单没有排序,您的要求从根本上需要大量的工作。

简化了代码看起来是这样的:

// Assuming the data is in an array named "people": 
let predicate = NSPredicate(format: "Name = %@", "Bill") 
let results = people.filteredArrayUsingPredicate(predicate) 

但这只是意味着通过列表搜索是由框架,而不是由你来完成。

根据您的应用程序在做什么,您可能需要考虑将此数据保存在核心数据中。它针对搜索匹配等操作进行了优化。更不用说,你不必将整个列表保存在内存中。

1

使用filter应该在大阵列上比增量式For-In循环至少快一点。

斯威夫特阵列版本:

let peopleNamedTom = arrayOfPeople.filter { $0["Name"] == "Tom" } 

SwiftyJSON阵列版本:

let peopleNamedTom = arrayOfPeople.filter { $1["Name"] == "Tom" } 

如果可惜这不是显著快于你的情况,我觉得比这个任务循环反正更方便。

另请注意,SwiftyJSON对象会增加开销,并且比本地Swift集合迭代要慢。如果你的JSON模型很简单,那么你可以使用Swift数组而不是SwiftyJSON来使用NSJSONSerialization。