iOS:键入时搜索建议

时间:2013-05-31 17:09:37

标签: ios cocoa-touch uisearchbar

我有一个带有searchView和tableView的viewcontroller,我希望tableView根据searchView的文本显示来自websearch的结果(当您向搜索添加更多字母时更改)。

正如我现在所说的那样,每次添加一个字母时它都会正常搜索,但是在搜索时app会停止,所以在最后一个结果返回之前你不能添加一个新的字母。

是否有更聪明的方法可以这样做,以便在添加新字母时,最后一次搜索基本上已中止?

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if(searchText.length>3)
    {
        [self getWebDataWithQuery:searchBar.text]
        [tblResults reloadData];
    }
}

4 个答案:

答案 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)

你可以做类似的事情:

  • 在视图控制器上加载从web /数据库/核心数据加载数据
  • 将数据放入数组(数据可以是对象或字典),在我的示例中是“arrayOfActivities”
  • 创建一个辅助数组,让我们称之为“filteredArray”并复制其中的所有内容

然后,在每个数字处,使用谓词更新已过滤的数组。 如果您有一个小数据集(您甚至可以将数据拆分为两个数组,并且仅允许搜索一小部分,例如最新的数据集),这是很好的。

- (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。