繁体   English   中英

如何延迟搜索结果显示在表格视图中?

[英]How to delay search results to appear in tableview?

我是编程方面的新手,尤其是obj-c。 我正在iOS应用程序中开发一个搜索栏,该搜索栏可以挖掘到一个很大的数据库(8.000个以上的条目并在不断增长),但是一旦我在搜索字段中键入内容,由于输入的内容很大,它会开始过滤返回结果大量的数据,它几乎冻结了键盘。 我的猜测是让搜索开始于4位数字,因此与其从8.000+个条目中查找,不如从较小的子集中进行搜索,但是用我编写的代码,它在4位数字之后一直冻结。

有什么提示吗?

谢谢,

这是我的代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    NSUInteger length = [searchText length];
    if (![NSString isEmpty:searchText] & (length > 3))
    {
        self.filteredItems = [self.sedi filterMatch:^BOOL(id elem)
                          {
                              Sede *sede = (Sede *)elem;
                                  NSArray *split = [searchText componentsSeparatedByString:@" "];

                                  return [sede.nome matchAll:split] ||
                                  [sede.descrizione matchAll:split] ||
                                  [sede.indirizzo matchAll:split] ||
                                  [sede.generi matchAll:split];
                              }
                                           contains:^BOOL(id elem)
                              {
                                  Sede *sede = (Sede *)elem;
                                  NSArray *split = [searchText componentsSeparatedByString:@" "];
                                  return [sede.nome containsAll:split] ||
                                  [sede.descrizione containsAll:split] ||
                                  [sede.indirizzo containsAll:split] ||
                                  [sede.generi containsAll:split];
                              }];
        [self.searchDisplayController.searchResultsTableView reloadData];
    }
}

首先,正如rmaddy所说,为简单起见,让用户点击“搜索”按钮可能会更好。

也就是说,您应该可以使用NSOperationQueue来完成此NSOperationQueue

首先,创建一个ivar或属性:

NSOperationQueue *_searchOperationQueue;

然后,在某处初始化它,可能是viewDidLoad

_searchOperationQueue = [NSOperationQueue new];
_searchOperationQueue.maxConcurrentOperationCount = 1;

然后,您应该能够将代码包装在NSOperation如下所示:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    // cancel any existing search
    [_searchOperationQueue cancelAllOperations];

    // begin new search
    [_searchOperationQueue addOperationWithBlock:^{
        NSUInteger length = [searchText length];
        if (![NSString isEmpty:searchText] && (length > 3))
        {

          NSArray *filteredTemp = [self.sedi filterMatch:^BOOL(id elem)
                                  {
                                  Sede *sede = (Sede *)elem;
                                      NSArray *split = [searchText componentsSeparatedByString:@" "];

                                      return [sede.nome matchAll:split] ||
                                      [sede.descrizione matchAll:split] ||
                                      [sede.indirizzo matchAll:split] ||
                                      [sede.generi matchAll:split];
                                  }
                                               contains:^BOOL(id elem)
                                  {
                                      Sede *sede = (Sede *)elem;
                                      NSArray *split = [searchText componentsSeparatedByString:@" "];
                                      return [sede.nome containsAll:split] ||
                                      [sede.descrizione containsAll:split] ||
                                      [sede.indirizzo containsAll:split] ||
                                      [sede.generi containsAll:split];
                                  }];
              // update view on main thread
              dispatch_async(dispatch_get_main_queue(), ^{
                self.filteredItems = filteredTemp;
                [self.searchDisplayController.searchResultsTableView reloadData];
              });
        }
    }];
}

我使用几乎与此相同的代码来过滤大型列表,并获得了很好的结果。 您只需要注意仅在主线程上访问模型即可保持模型和视图同步(这是我最后做的)。

最后要注意的一点是,您在代码中使用的是按位“ AND”( & ),而不是有条件的“ AND”( && ),我在回答中对此进行了更正。 尽管在此特定情况下它实际上可以正确运行,但几乎可以肯定是一个错误,因此请小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM