2017-04-12 30 views
1

我想讓http任務運行,設置全局定義的變量jwt。然後,只有當我想運行通過jwt的seque到我的下一個活動。Swift:如何確保在http任務完成之前seque不會運行?

我知道它們運行不正常,因爲打印語句失靈。捕獲是在底部。我編輯了實際的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 
     } 
    } 
} 

} 

第二視圖控制器

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

聽起來好像你有一個按鈕觸發了一個segue和一個URLSession請求。由於請求是異步的,所以segue將始終在請求完成之前啓動。該按鈕同時觸發,並且我不知道告訴賽格等待。

如果您希望在請求之後啓動segue,您需要從按鈕中刪除現有的segue(只需單擊它並在Interface Builder中刪除),創建一個手動的segue(帶有標識符),然後使用performSegue手動呈現segue。

要在目的地ViewController創建在源ViewController的頂部條在界面生成器,從ViewController圖標(用白色正方形內黃色圓圈)控制拖動手動SEGUE到任何地方。

一個會彈出菜單,讓你選擇你想要什麼樣的過渡。一旦創建完成,請轉到「屬性」檢查器並設置一個描述性標識符。

現在您在URLSession的回調中添加代碼以手動調用新的segue。添加這一行「檢查點1」之後:

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

現在你賽格瑞應該發生後,才請求完成。這也很好,因爲如果請求失敗或者你不喜歡響應,你可以跳過執行segue。

+0

現在你指出它很痛苦。非常感謝 –

+0

@DavidRichards大多數編程問題都是。很高興它對你有效! – Robert

0

沒有必要在這裏使用segue。
在任務回調中,您可以使用presentViewController方法呈現新的視圖控制器(或者如果您有導航控制器,則爲pushViewController)。

相關問題