我有一个世界上所有机场的
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
}
如何提高此功能的性能?
最佳答案 我最终考虑了所有的评论并提出了这个问题.
>我更改了逻辑,因此只有在键入2个字符而不是1后才运行applyFilterWithSearchQuery.
>在每个结果之后缓存结果,因此仅搜索子列表
>将功能更改为使用NSPredicate,如下所示:
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>]
}
整体CPU时间下降到1%.感谢所有有建议的人