当前位置: 首页 > 面试题库 >

如何在iOS UISearchBar中限制搜索(基于键入速度)?

扶杜吟
2023-03-14
问题内容

我有UISearchDisplayController的UISearchBar部分,该部分用于显示来自本地CoreData和远程API的搜索结果。我要实现的是在远程API上进行搜索的“延迟”。当前,对于用户键入的每个字符,都会发送一个请求。但是,如果用户输入速度特别快,那么发送许多请求就没有意义:这将有助于等待用户停止输入。有办法实现吗?

阅读文档建议您等到用户明确点击搜索后,但就我而言,它并不理想。

性能问题。如果可以非常快速地执行搜索操作,则可以通过在委托对象上实现searchBar:textDidChange:方法来更新用户输入时的搜索结果。但是,如果搜索操作花费更多时间,则应等到用户点按“搜索”按钮,然后才能在searchBarSearchButtonClicked:方法中开始搜索。始终在后台线程中执行搜索操作,以避免阻塞主线程。这样可以在搜索运行时使您的应用对用户保持响应,并提供更好的用户体验。

向API发送许多请求不是本地性能的问题,而仅仅是避免远程服务器上的请求率过高。

谢谢


问题答案:

通过此链接,我找到了一种非常快捷,干净的方法。与Nirmit的答案相比,它缺少“加载指示器”,但是在代码行数方面胜出,并且不需要其他控件。我首先将该dispatch_cancelable_block.h文件添加到了我的项目(来自此repo),然后定义了以下类变量__block dispatch_cancelable_block_t searchBlock;

我的搜索代码现在看起来像这样:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (searchBlock != nil) {
        //We cancel the currently scheduled block
        cancel_block(searchBlock);
    }
    searchBlock = dispatch_after_delay(searchBlockDelay, ^{
        //We "enqueue" this block with a certain delay. It will be canceled if the user types faster than the delay, otherwise it will be executed after the specified delay
        [self loadPlacesAutocompleteForInput:searchText]; 
    });
}

笔记:

  • loadPlacesAutocompleteForInput是金LPGoogleFunctions库
  • searchBlockDelay在之外定义如下@implementation

静态CGFloat searchBlockDelay = 0.2;



 类似资料:
  • 我正在做一个项目,处理一个电子邮件地址列表(大约400万个条目),并确定他们是否有相关的facebook帐户。我使用graph API搜索查询来检测这一点。现在有没有可能我会得到一个利率限制,或者甚至有任何官方利率限制吗?考虑到列表非常大,也许我们会做多线程请求,我担心任何速率限制。 我听说过非官方的600请求/ 600秒,但没有在facebook上看到任何证据。

  • 我在写一个地牢风格的游戏,地牢基本上是一个网格窗格。我想让玩家每0.5秒移动一格,如果他保持控制键。但我不知道如何做到这一点。我读过JavaFX:如何检测钥匙是否被按下。但这个问题与我的问题并没有特别的关系(除了我可以追踪发生了多少关键事件,或许可以在此基础上做更多)。所以我跟随这篇文章并尝试使用线程。sleep()解决了我的问题,但事实证明玩家只是停了几秒钟,然后突然移动了几格。 有人知道怎么解

  • 问题内容: 我有三个食物类型索引:“意大利”,“西班牙”,“美国”。当用户搜索“奶酪”时,“意大利”文档似乎出现在顶部。如果我偏爱说“西班牙语”,是否可以“增强”结果?(我仍然应该获得意大利语的结果,但是基于索引类型“ Spanish”的一些数值提升值,结果中返回的文档的顺序将优先使用“ Spanish”索引。在用户输入的lucene和/或ES查询? 问题答案: 添加带有字词查询或字段(或两者都有

  • 我试图通过传递键从JpaRepository的getOne中按主键搜索 我有一个模型(客户),其中定义了客户的详细信息。我有一个接口服务(CustomerService)及其实现(CustomerServiceImpl,它实现CustomerService)。我还有一个接口存储库(CustomerRepository),它扩展了JpaRepository。现在在我的控制器中,我将id传递给函数(f

  • const UserSchema=new mongoose.schema({name:String,project_name:String}); const User=new mongoose.model(“User”,UserSchema); 我希望,如果一个项目名称是“机器学习和oops”,我在搜索框中搜索“oops”,我应该得到“机器学习和oops”显示

  • 问题内容: 我有一个查询,用于查找按位置排序的结果。结果还必须考虑增值税,因此这也在查询中。不幸的是,该查询在未缓存时可能需要4秒钟以上的时间才能运行。谁能发现任何明显的问题或建议我做些什么来改善它? 只是为了澄清查询中正在发生的事情: 计算的距离是使用经/纬度的欧几里得距离 当包含增值税时,incvat字段用于显示价格 WHEN / THEN语句用于将价格0置于最底端 查询: 问题答案: 您可以