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”,则会出现很多项,请求将花费很多时间),并且会覆盖短请求
谢谢您可以延迟发送请求并取消以前的请求。 以下是我的例子:
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之前发送的方法相同吗?抱歉,在发布答案之前没有重新加载我的屏幕。是的,是萨米,我也要试试!你知道这是不是苹果推荐的方法吗?我不知道,这是大多数开发人员在这个案例中使用的解决方案