我有一个带有searchView和tableView的viewcontroller,我希望tableView根据searchView的文本显示来自websearch的结果(当您向搜索添加更多字母时更改)。
正如我现在所说的那样,每次添加一个字母时它都会正常搜索,但是在搜索时app会停止,所以在最后一个结果返回之前你不能添加一个新的字母。
是否有更聪明的方法可以这样做,以便在添加新字母时,最后一次搜索基本上已中止?
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if(searchText.length>3)
{
[self getWebDataWithQuery:searchBar.text]
[tblResults reloadData];
}
}
答案 0 :(得分:1)
您拨打[self getWebDataWithQuery:searchBar.text]
的电话正在拨打[NSData datawithContentsOfURL:]
。这是同步通话。您需要使用异步机制从Web服务收集数据。使用第三方网络框架,如AFNetworking或NSULRConnection。
这将允许用户继续键入并且不会阻止UI。
答案 1 :(得分:1)
您可以在搜索结果中使用此类调用
dispatch_async(dispatch_get_main_queue(), ^{
[self getWebDataWithQuery:searchBar.text]
[tblResults reloadData]
});
答案 2 :(得分:0)
你可以做类似的事情:
然后,在每个数字处,使用谓词更新已过滤的数组。 如果您有一个小数据集(您甚至可以将数据拆分为两个数组,并且仅允许搜索一小部分,例如最新的数据集),这是很好的。
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
{
if (![searchText isEqualToString:@""]) // here you check that the search is not null, if you want add another check to avoid searches when the characters are less than 3
{
// create a predicate. In my case, attivita is a property of the object stored inside the array
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(attivita CONTAINS[cd] %@)", searchText];
self.filteredArray = [[self.arrayOfActivities filteredArrayUsingPredicate:predicate] mutableCopy];
} else {
self.filteredArray = [self.arrayOfActivities mutableCopy]; // I used a mutable copy in this example code
}
// reload section with fade animation
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}
答案 3 :(得分:0)
另一种方法(我在其中一个项目中这样做)我为搜索创建了一个NSOperations。每次更改搜索字符串中的字符时,我都会检查上一个搜索查询是否与当前搜索查询不相等,如果不是,则取消所有执行操作,然后创建新操作并启动它。
当然,所有请求/数据处理都在后台线程中执行,并且只有在完成下载/解析/处理时才会通知UI。