我必须开发一个应用程序来处理来自网络服务调用的大量数据。
有一个带有搜索栏的 UITableView,当用户输入一个字母时,tableview 应该动态显示与搜索栏中的文本对应的搜索结果。
处理这种数据传输的最佳方式是什么?每次用户输入字母时发送请求似乎是个坏主意。
我必须开发一个应用程序来处理来自网络服务调用的大量数据。
有一个带有搜索栏的 UITableView,当用户输入一个字母时,tableview 应该动态显示与搜索栏中的文本对应的搜索结果。
处理这种数据传输的最佳方式是什么?每次用户输入字母时发送请求似乎是个坏主意。
一个好的方法是仅使用搜索过滤的数据重新加载表。
NSArray
你的价值观NSArray
然后为过滤的结果创建另一个然后你像这样遍历第一个数组:
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];
}
}
现在你重新加载表arrayOfResults
而不是arrayOfAll
是的,每次用户键入字母时都发送请求是个坏主意……但是,例如,如果您使用 NSOperationQueues 实现它,则可以在点击键(任何字符或退格键)时取消先前的请求,那么您只会有一个请求去服务器。这只是一个建议,无论如何请在实施时多加考虑。
显然,最简单的方法是如 Prashant 所说。
@tonio 据我了解,您假设您已经拥有 NSArray 中的所有数据,并且您只需使用 NSRange 过滤解析结果。正如 Karthik 所说,这是来自 Web 服务的大量数据,可能需要很长时间才能加载,并且是不必要的网络流量。但是可以说这是您想要的方式,我建议使用 NSPredicate 过滤结果:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",searchText];
NSArray *filteredResults = [arrayOfAll filteredArrayUsingPredicate: predicate];
现在您在 TableView 中使用过滤结果数组。
不要对每个字母进行搜索,而是在用户点击“搜索”按钮时进行搜索。
这有点取决于“巨大”有多大以及用户将如何使用该应用程序。
如果加载整个数据集需要几分钟,那么我会倾向于获得较少量的数据块,例如每次搜索字符串更改时。
如果数据不是那么“巨大”,那么如果您不想像 Prashant Bhayani 建议的那样使用“搜索”按钮(他可能是移动设备恕我直言的最佳解决方案),请使用 tonio.mg 的建议。
请记住,重要的不是您“想要”如何实现此功能,而是您的最终用户希望此功能如何为他们工作。通常,用户不想等待(等待庞大的数据集),他们确实希望快速轻松地访问最新的数据(延迟加载)。