Ios UISearchController对webservice的请求,而不堆叠许多请求

Ios UISearchController对webservice的请求,而不堆叠许多请求,ios,swift,api,uisearchcontroller,Ios,Swift,Api,Uisearchcontroller,我正在使用UISearchController将对象获取到我的tableview。我的主要问题是在用户键入文本时堆叠大量请求 每次用户键入一个字符时,控制器都会向我的api发送另一个请求,这对我来说毫无意义,因为第一个请求肯定是最长的一个(如果用户键入“a”,则会出现很多项,请求将花费很多时间),并且会覆盖短请求 用户类型:a(第一个请求需要10秒才能获取包含a的所有内容) 用户继续键入:bacate(许多请求比第一个请求更快) api返回对bacate(水果ABATE)的所有请求,并将显示在屏

我正在使用
UISearchController
将对象获取到我的
tableview
。我的主要问题是在用户键入文本时堆叠大量请求

每次用户键入一个字符时,控制器都会向我的api发送另一个请求,这对我来说毫无意义,因为第一个请求肯定是最长的一个(如果用户键入“a”,则会出现很多项,请求将花费很多时间),并且会覆盖短请求

  • 用户类型:a(第一个请求需要10秒才能获取包含a的所有内容)

  • 用户继续键入:bacate(许多请求比第一个请求更快)

  • api返回对bacate(水果ABATE)的所有请求,并将显示在屏幕中

  • api现在(因为需要很多时间)返回对单个a的请求,并覆盖包含a的所有水果

  • 抱歉把我的问题搞得一团糟,我真的很困惑


    谢谢

    您可以延迟发送请求并取消以前的请求。 以下是我的例子:

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
        if searchText != "" {
            // to limit network activity, reload half a second after last key press.
            NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(MyController.search), object: nil)
            self.perform(#selector(MyController.search), with: nil, afterDelay: 0.5)
        }
    }
    
    func search() {
    
        // Send request
    
    }
    

    您可以向搜索添加限制

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        // to limit network activity, reload half a second after last key press.
        NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.sendRequest), object: nil)
        self.perform(#selector(self.reload), with: nil, afterDelay: 0.5)
    }
    func sendRequest() {
        print("send request")
    

    }

    发送搜索数据时,启动计时器几秒钟。当计时器过期时,将搜索请求提交到API。如果在计时器触发之前传递了另一个字符,请重新启动计时器。@Paulw11如果在计时器过期之后但在api响应之前传递了另一个字符,我该怎么办?我应该让它显示新结果的结果awaint吗?正常情况下再次启动计时器。如果计时器再次过期,则提交另一个请求。取消现有请求没有多大意义,因为在计时器再次过期之前,它可能已经几乎完成。诀窍是将计时器设置得足够短,以使UI具有响应性,但不要设置得太短,以使API中充斥着大量无用的查询。通常情况下,人们会在暂停查看结果之前快速键入内容,然后可能会键入更多内容以进一步细化,因此在实践中,多个并发查询并不是什么大问题。非常感谢@Paulw11,我将尝试一下!)谢谢@jasmete!这和@DiegoQ之前发送的方法相同吗?抱歉,在发布答案之前没有重新加载我的屏幕。是的,是萨米,我也要试试!你知道这是不是苹果推荐的方法吗?我不知道,这是大多数开发人员在这个案例中使用的解决方案