2016-10-10 15 views
2

新しいView ControllerにSegueを実行しようとしていますが、Segueが2回呼び出されていて、新しいView Controllerが2回表示されます。
私は、データを取得するためにAPIにGETリクエストを実行するメソッドを使用しています。
このメソッドは、完了ハンドラを使用します。DispatchQueue.main.asyncを使用するとsegueが2回呼び出される

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

メソッドが正常に完了すると、必要に応じてメインキュー内からsegueが呼び出されます。

私は何が起こっているのかを見ることができ、performSegueから実行がジャンプしてメソッドが成功したかどうかをチェックし、segueがもう一度呼び出されるまで続行する条件にジャンプします。
私は純粋にプログラム的なセグを試しましたが、結果は同じでした。
私もprint文を追加しました。私がsegueをコメントアウトすると、print文は1回だけ呼び出されます。

私はこれまで同じパターンを何度も使ってきましたが、問題は一度もありませんでした。なぜこれが起こっているのか分かりません。 。
私はこの時間がスウィフト3を使用して、代わりにdispatch_asyncのDispatchQueue.main.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)") 
      } 
     } 
} 

編集:私は問題が何であるかを知りませんでしたが、ストーリーボードを完全に削除し、それを作り直してみました。

答えて

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をチェックするにはあまりにも多くの処理能力が必要ないので、メインキューに入れるのは悪いことだと思いますが、これをトラブルシューティングに使用します。申し訳ありませんが、私はこれについてコメントできません。

+0

私はこれを試しましたが、URLSession GETリクエストでエラーが発生します。 – lxirsh

0

ストーリーボードをチェックインしてください。コントローラの代わりにボタンアクションからsegueを設定することもできます。

+0

ストーリーボードを確認して再確認しました。私はストーリーボードのセグを削除し、プログラム的なセグを試しました。それでも同じ問題がありましたが、 – lxirsh

関連する問題