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

我有一个世界上所有机场的
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%.感谢所有有建议的人

点赞