2016-10-10 28 views
2

我试图执行一个新的视图控制器,但segue被调用两次,并且新的视图控制器出现两次。
我正在使用执行GET请求到API来检索数据的方法。
该方法使用完成处理程序。当使用DispatchQueue.main.async时segue调用两次

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

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

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

我以前使用过这种模式很多次,从来没有遇到过问题,我无法弄清楚为什么会发生这种情况。
我做的不同,这一次的唯一的事情是用斯威夫特3和使用的dispatch_async代替(dispatch_get_main_queue()DispatchQueue.main.async

这是它给我这个问题的功能:

@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)") 
      } 
     } 
} 

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

回答

0

我知道这不是一个很好的方法来解决这个问题,我也不能留下评论以低信誉,但如果您将整个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") 
     } 
    } 
} 

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

+0

我刚刚尝试过,但会导致URLSession GET请求发生错误。 – lxirsh

0

检查故事板,也许你从你的按钮动作,而不是控制器设置赛格。

+0

我检查并重新检查故事板。我甚至删除了故事板segue,并尝试了一个programatic赛格。仍然有同样的问题, – lxirsh