1

我必须开发一个应用程序来处理来自网络服务调用的大量数据。

有一个带有搜索栏的 UITableView,当用户输入一个字母时,tableview 应该动态显示与搜索栏中的文本对应的搜索结果。

处理这种数据传输的最佳方式是什么?每次用户输入字母时发送请求似乎是个坏主意。

4

4 回答 4

3

一个好的方法是仅使用搜索过滤的数据重新加载表。

  1. 你有NSArray你的价值观
  2. NSArray然后为过滤的结果创建另一个
  3. 然后你像这样遍历第一个数组:

    for (int i = 0; i < [arrayOfAll count]; i++){
    
        NSString *sTemp = [arrayOfAll objectAtIndex:i];
    
        NSRange titleResultsRange = [sTemp rangeOfString:searchText
                                                 options:NSCaseInsensitiveSearch];
    
        if (titleResultsRange.length > 0){
            [arrayOfResults addObject:sTemp];
        }
    }
    
  4. 现在你重新加载表arrayOfResults而不是arrayOfAll

于 2012-02-01T12:46:30.477 回答
2

是的,每次用户键入字母时都发送请求是个坏主意……但是,例如,如果您使用 NSOperationQueues 实现它,则可以在点击键(任何字符或退格键)时取消先前的请求,那么您只会有一个请求去服务器。这只是一个建议,无论如何请在实施时多加考虑。

显然,最简单的方法是如 Prashant 所说。

@tonio 据我了解,您假设您已经拥有 NSArray 中的所有数据,并且您只需使用 NSRange 过滤解析结果。正如 Karthik 所说,这是来自 Web 服务的大量数据,可能需要很长时间才能加载,并且是不必要的网络流量。但是可以说这是您想要的方式,我建议使用 NSPredicate 过滤结果:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",searchText];
NSArray *filteredResults = [arrayOfAll filteredArrayUsingPredicate: predicate];

现在您在 TableView 中使用过滤结果数组。

于 2012-02-01T13:24:55.190 回答
0

不要对每个字母进行搜索,而是在用户点击“搜索”按钮时进行搜索。

于 2012-02-01T12:44:44.127 回答
0

这有点取决于“巨大”有多大以及用户将如何使用该应用程序。

如果加载整个数据集需要几分钟,那么我会倾向于获得较少量的数据块,例如每次搜索字符串更改时。

如果数据不是那么“巨大”,那么如果您不想像 Prashant Bhayani 建议的那样使用“搜索”按钮(他可能是移动设备恕我直言的最佳解决方案),请使用 tonio.mg 的建议。

请记住,重要的不是您“想要”如何实现此功能,而是您的最终用户希望此功能如何为他们工作。通常,用户不想等待(等待庞大的数据集),他们确实希望快速轻松地访问最新的数据(延迟加载)。

于 2012-02-01T13:50:07.263 回答