在Swift中搜索大型数组性能

时间:2015-01-28 17:20:17

标签: 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
}

如何改善此功能的性能?

1 个答案:

答案 0 :(得分:2)

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

  1. 我更改了逻辑,因此只有在输入2个字符而不是1后才运行applyFilterWithSearchQuery。
  2. 在每个结果后缓存结果,因此只搜索子列表
  3. 将功能更改为使用NSPredicate,如下所示:
  4. &#13;
    &#13;
        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;
    &#13;
    &#13;

    整体CPU时间下降到1%。感谢所有有建议的人