我有一个世界上所有机场的JSON文件,我试图在一个函数中搜索但它很慢并且我正在努力提高它的性能。这个JSON文件中有9500个条目(我会使用Web API,但无法找到一个免费的,所以我使用这个JSON文件)。我的数组就像:
var data = [Dictionary<String, AnyObject>]
以下是其中一个词典:
[DisplayText: YYZ, airportObject: {
0 = 193;
Altitude = 569;
City = Toronto;
Country = Canada;
DST = A;
IATA = YYZ;
ICAO = CYYZ;
Latitude = "43.677223";
Longitude = "-79.630556";
Name = "Lester B Pearson Intl";
TZ = "America/Toronto";
UTC = "-5";
}, DisplaySubText: Lester B Pearson Intl]
目标是在用户在字段中键入时,使用机场名称自动填充TextField。我写了一个函数,用用户的输入过滤这些条目。它的工作原理非常慢,每个字母输入大约需要1秒钟,输入时cpu会达到50%。
这是函数
func applyFilterWithSearchQuery(filter : String) -> [Dictionary<String, AnyObject>]
{
//let predicate = NSPredicate(format: "DisplayText BEGINSWITH[cd] \(filter)")
var lower = (filter as NSString).lowercaseString
var filteredData = data.filter({
if let match : AnyObject = $0["DisplayText"]{
//println("LCS = \(filter.lowercaseString)")
return (match as NSString).lowercaseString.hasPrefix((filter as NSString).lowercaseString)
}
else{
return false
}
})
return filteredData
}
如何改善此功能的性能?
答案 0 :(得分:2)
我最终考虑了所有的评论并想出了这个。
func applyFilterWithSearchQuery(filter : String) -> [Dictionary<String, AnyObject>]
{
let predicate = NSPredicate(format: "DisplayText BEGINSWITH[cd] %@", filter)
let filteredData = (self.data as NSArray).filteredArrayUsingPredicate(predicate!)
return filteredData as [Dictionary<String, AnyObject>]
}
&#13;
整体CPU时间下降到1%。感谢所有有建议的人