2016-10-10 80 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