搜索海量数据来自 iPhone 中的 Web 服务

发布于 2025-01-01 13:21:04 字数 156 浏览 0 评论 0原文

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

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

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

I have to develop an app which should handle huge amount of data which is come from web service call.

There is a UITableView with search bar, When ever the user type a letter, the tableview should dynamically display the search result corresponding to the text in the search bar.

What is the best way to handle this kind of data transfer? Sending request every time when the user type a letter seems to be a bad idea.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

自由如风 2025-01-08 13:21:04

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

  1. 您有一个带有您的值的 NSArray
  2. 然后您为过滤后的结果创建另一个 NSArray
  3. 然后您像这样浏览第一个数组:

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

A good approach can be to reload the table only with the data filtered by the search.

  1. You have a NSArray with your values
  2. Then you create another NSArray for your results filtered
  3. Then you go through the first array like this:

    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. Now you reload the table with arrayOfResults instead of arrayOfAll

遥远的她 2025-01-08 13:21:04

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

显然,最简单的方法就是普拉桑特所说的那样。

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

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

现在您在 TableView 中使用filteredResults 数组。

Yes, to send a request every time the user types a letter is a bad idea... but, if for example you implements it using NSOperationQueues you can cancel previous requests when a key is tapped (any character or backspace) then you will only have one request going to the server. It's just a suggestion and please take a lot of consideration in implementing it anyway.

Obviously the simplest way is as Prashant says.

@tonio As I understand, you are assuming you have all the data in an NSArray already and you just filter the results parsing with an NSRange. As Karthik said, it's a huge amount of data from the web service and it might take a lot of time to load and is unnecessary network traffic. But lets say that this is the way you want to do it, I would suggest to filter the results using an NSPredicate:

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

Now you use the filteredResults array in the TableView.

用心笑 2025-01-08 13:21:04

这在某种程度上取决于“巨大”有多大以及用户将如何使用该应用程序。

如果需要几分钟的时间来加载整个数据集,那么我会倾向于获取较少量的数据块,例如每次搜索字符串发生变化时。

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

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

It kind of depends on how big is "huge" and how the users will use the app.

If it takes a few minutes to the load the entire data set then I would be inclined to get the smaller amount of data piece meal e.g. every time the search string changes.

If the data is not that "huge" then go with tonio.mg' suggestion if you don't want to have a "search" button like Prashant Bhayani suggested (his is probably the best solution for mobile devices imho).

Remember the important thing is not how you "want" to implement this functionality but how your end-users want this functionality to work for them. Typically users don't want to wait (for a huge data set) they do want quick easy and up-to date data access (lazy loading).

过去的过去 2025-01-08 13:21:04

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

Don't do a search on each letter but rather when the user taps on a "Search" button.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文