在使用DispatchQueue.main.async

时间:2016-10-10 16:33:30

标签: ios swift swift3 grand-central-dispatch

我正在尝试对新的视图控制器执行segue,但是segue被调用两次,新的视图控制器出现两次。
我正在使用一种对API执行GET请求的方法检索数据。
该方法使用完成处理程序。

func getSearchResultsForQuery(_ query: String, completionHandlerForSearchResultsForQuery: @escaping (_ success: Bool, _ error: NSError?) -> Void)

当方法成功完成时,我会根据需要从主队列中调用segue。

我已经设置了断点,所以我可以看到发生了什么,执行从performSegue跳回到条件,检查方法是否成功,然后继续直到第二次调用segue。我尝试了一个纯粹的程序设计,但结果是一样的。
我还添加了一个print语句,如果我注释掉segue,那么print语句只被调用一次。

之前我曾经多次使用过这种模式,从来没有遇到任何问题我只是无法弄清楚为什么会发生这种情况。
这次我唯一不同的是使用Swift 3并使用DispatchQueue.main.async而不是dispatch_async(dispatch_get_main_queue()。

这是给我这个问题的函数:

    @IBAction func search(_ sender: UIButton) {

        let searchQuery = searchField.text

        TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in

            if success {
                print("Food items fetch successful")
                DispatchQueue.main.async {
                    print("Perorming segue for food item: \(searchQuery)")
                    self.performSegue(withIdentifier: "showFoodItems", sender: self)
                }
            } else {
                print("error: \(error)")
            }
        }
}

编辑:我从来没有发现问题是什么,但完全删除故事板并重新创建它解决了它。

2 个答案:

答案 0 :(得分:0)

我知道这不是修复这个问题的好方法,而且由于信誉不好我也不能发表评论但是如果你在DispatchQueue.main中包装整个if语句会发生什么?

 @IBAction func search(_ sender: UIButton) {

    let searchQuery = searchField.text

    TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in
     DispatchQueue.main.async {
       if success {
         print("Food items fetch successful")
         self.performSegue(withIdentifier: "showFoodItems", sender: self)
       } else {
         print("error")
       }
     }
}

会产生不同的结果还是会产生相同的结果?检查Bool并不需要太多的处理能力,因此我不认为将它放在主队列中是一件坏事,但我这样做是为了解决问题。对不起,我不能对此发表评论。

答案 1 :(得分:0)

签入故事板,也许你从按钮动作而不是控制器设置segue。