我有一个包含全球所有机场的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
}
如何提高这个函数的性能?
lowercaseString
。 (为什么你要使用lower
而且甚至没有使用它???)此外,你可能会发现NSString的方法来确定match
是否以filter
开头比hasPrefix
更快。 - mattNSPredicates
。停止重复转换筛选条件为小写,使用预先转换的版本。缓存结果以便下一次使用(当您已经有一个A列表时,无需为AB过滤完整列表,只需重新过滤子列表即可)。 - David Berry