繁体   English   中英

使用DispatchQueue.main.async时segue调用了两次

[英]segue called twice when using DispatchQueue.main.async

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

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

该方法成功完成后,将根据需要从主队列中调用我的segue。

我已经设置了断点,以便可以看到发生了什么,并且执行从performSegue跳回到检查该方法是否成功的条件,然后继续执行直到再次调用segue。
我尝试了纯粹的程序化搜索,但结果是相同的。
我还添加了一条打印语句,如果我注释掉segue,则该打印语句仅被调用一次。

我以前使用过相同的模式很多次,但从未遇到过问题,我只是想不明白为什么会这样。
这次我要做的唯一不同就是使用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)")
            }
        }
}

编辑:我从来没有发现问题是什么,但完全删除情节提要,然后重新创建就可以解决。

我知道这不是解决此问题的好方法,而且由于声誉低下,我也无法发表评论,但是如果将整个if语句包装在DispatchQueue.main中,会发生什么情况?

 @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不需要太多的处理能力,因此我不认为将其放在主队列中是一件坏事,但我这样做是为了解决问题。 抱歉,我不能对此发表评论。

签入情节提要,也许您是通过按钮操作而不是控制器来设置segue的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM