【问题标题】:Cancel completion handler (iOS)取消完成处理程序 (iOS)
【发布时间】:2017-03-17 17:05:12
【问题描述】:

我有一个文本字段,每当 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。

如果我在发生先前搜索时取消完成处理程序,则可以解决此问题。我该怎么做呢?还是有更好的解决方案?

【问题讨论】:

  • 您可以检查查询字符串是否仍然等于文本字段的文本,如果它们不同则不重新加载表格。
  • @dan 简单而有效的解决方案。很遗憾,我不能接受您的评论作为答案。
  • 我的方法是在文本更改时启动计时器(例如 0.5 秒),并在文本再次更改时重新启动计时器。只有当计时器触发时,我才会真正执行搜索操作。

标签: ios completionhandler


【解决方案1】:

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

【讨论】:

  • 如果我没有像 Dan 提供的简单解决方案,这实际上是我的下一步行动。谢谢阿比伦。
【解决方案2】:

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

【讨论】:

  • 我尝试为此使用布尔值,但问题是较长的字符串(搜索“进行中”与“正在”)比短字符串更快地获取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2013-11-24
  • 2015-04-06
  • 1970-01-01
  • 2013-02-18
  • 2013-03-24
相关资源
最近更新 更多