取消完成处理程序(iOS)

取消完成处理程序(iOS),ios,completionhandler,Ios,Completionhandler,我有一个textfield,每次textfield文本更改时,它都会从API中获取数据,并更新表 override func viewDidLoad() { super.viewDidLoad() searchTextField.addTarget(self, action: #selector(textFieldDidChange), for: UIControlEvents.editingChanged) } func textFieldDidChange() {

我有一个textfield,每次textfield文本更改时,它都会从API中获取数据,并更新表

override func viewDidLoad() {
    super.viewDidLoad()

    searchTextField.addTarget(self, action: #selector(textFieldDidChange), for: UIControlEvents.editingChanged)
}

func textFieldDidChange() {

    let queryString = self.searchTextField.text

    SearchWSFacade.getSearchResults(queryString: queryString) {
         (error) in

         if (error == nil) {
             self.tableView.reloadData()
         } 
    }
}
只有在用户输入慢速(允许在输入下一个字符之前加载数据)的情况下,这种方法才能发挥出色的效果。如果用户输入速度快,我们就会遇到问题,因为需要多次调用重新加载数据


如果在进行上一次搜索时取消了完成处理程序,则可以解决此问题。我该怎么做?或者有更好的解决方案吗?

如果您使用操作,您可以设置依赖项,以便在下一个操作完成之前不启动依赖项。而且,与块不同,操作可以取消。

您可以在包含文本字段的UIViewController中设置一个简单标志-
busyCallingAPI
,或者-在启动API调用时将其设置为true,在完成处理程序中将其设置为false,在
textfielddichange
中,仅当
busyCallingAPI
为false时才进行调用

您可以检查查询字符串是否仍然等于textfield的文本,如果它们不同,则不重新加载表。@dan简单但有效的解决方案。不幸的是,我不能接受你的评论作为答案。我的方法是在文本更改时启动计时器(例如0.5秒),并在文本再次更改时重新启动计时器。只有当计时器触发时,我才真正执行搜索操作。我尝试使用布尔值进行搜索,但问题是较长的字符串(搜索“进行中”与“搜索中”)比较短的字符串提取得更快。如果没有像Dan提供的简单解决方案,这实际上是我的下一步行动。谢谢你,阿比泽恩。