取消完成处理程序(iOS)

时间:2017-03-17 17:05:13

标签: ios completionhandler

我有一个文本字段,每次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()
         } 
    }
}

这非常有效,只有当用户键入慢时(允许在键入下一个字符之前加载数据)。如果用户快速键入,我们会遇到问题,因为多次调用reloadData。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

时才拨打电话