2017-04-12 12 views
1

httpタスクを実行して、グローバルに定義された変数jwtを設定します。その後、私は次の活動にjwtを渡すsequeを実行したいですか?Swift:httpタスクが完了する前にsequeが実行されないようにするにはどうすればよいですか?

printステートメントの順序が間違っているため、順序が間違っていることが分かりました。キャプチャが一番下にあります。私は実際のjwtを編集しましたが、ブラックボックスはjwtの文字列です。

メインビューコントローラ

import UIKit 

var jwt = "" 

クラスのViewController:のUIViewController {

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func submitLogin() { 

    let url = URL(string: "http://example.com") 

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
     guard error == nil else { 
      print(error!) 
      return 
     } 
     guard let data = data else { 
      print("Data is empty") 
      return 
     } 

     do { 
      if let json = try JSONSerialization.jsonObject(with: data, options:.allowFragments) as? [String:Any] { 

       jwt = json["jwt"] as! String 
       print("Checkpoint 1 " + jwt) 
      } 
     } catch let err{ 
      print(err.localizedDescription) 
     } 

    } 

    task.resume() 

} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "loginSubmit" { 

     if let toViewController = segue.destination as? HomeActivity { 
      print("Checkpoint 2 " + jwt) 
      toViewController.token = jwt 
     } 
    } 
} 

} 

第2のビューコントローラ

import UIKit 

クラスHomeActivity:のUIViewController私は一週間未満のためスウィフトをやってきた{

var token:String! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    renderInbox() 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func renderInbox() { 
    print("Printing token" + token) 
} 

}

Output Capture

P.S。したがって、一般的なヒントなどを歓迎します。グローバル変数を使わずにjwtをsequeに渡す方法など。または、出力画像のチェックポイント1の後ろにあるもの。

P.P.Sコードがスタックオーバーフローコードブロック内外にあることについて申し訳ありません。あなたがそれを修正する方法を知っているなら私に知らせて、私は試してみます

答えて

2

セグのリクエストとURLSessionリクエストの両方をトリガーするボタンが1つあるようです。要求は非同期であるため、要求が完了する前にセグが常に開始されます。ボタンは同時に両方をトリガーし、私がセグを待つように知らせる方法はありません。

リクエストの後にsegueを開始したい場合は、ボタンから既存のsegueを削除する(インターフェイスビルダで削除して削除する)、手動のsegue(識別子付き)を作成してからperformSegueを使用して手動でセグを提示してください。 Interface Builderで手動セグエを作成するには

、ソースViewControllerのトップバーでViewControllerアイコン(白抜きの四角と黄色の円)からの制御ドラッグ目的地ViewController内の任意の場所には。

メニューがポップアップし、あなたがしたいトランジションの種類を選択できます。作成したら、「属性」インスペクタに行き、わかりやすい識別子を設定します。

URLSessionのコールバックにコードを追加して、新しいSegueを手動で呼び出すようにしました。右の「チェックポイント1」の後に次の行を追加します。

performSegue(withIdentifier: "Your Identifier Here", sender: self) 

は、今すぐあなたのセグエは、要求が完了した後にのみ起こるはず。リクエストが失敗した場合やレスポンスが気に入らない場合は、セグをスキップすることができます。

+0

あなたがそれを指摘したのは痛いほど明白です。ありがとうございました –

+0

@DavidRichardsほとんどのプログラミング上の問題はあります。それはあなたのために働いてうれしい! – Robert

0

ここでsegueを使う必要はありません。
タスクのコールバックでは、presentViewControllerメソッドを使用して新しいビューコントローラ(またはナビゲーションコントローラを使用している場合はpushViewController)を表示できます。

関連する問題