gpt4 book ai didi

ios - 在 Swift 中搜索大型数组性能

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:21 24 4
gpt4 key购买 nike

我有一个世界上所有机场的 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
}

如何提高此功能的性能?

最佳答案

我最终考虑了所有的评论并想出了这个。

  1. 我更改了逻辑,因此它仅在键入 2 个字符而不是 1 个字符后才运行 applyFilterWithSearchQuery。
  2. 在每个结果后缓存结果,因此只搜索子列表
  3. 将函数更改为使用 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%。感谢所有有建议的人

关于ios - 在 Swift 中搜索大型数组性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28198439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com