2016-12-14 56 views
-5

我在第一個VC上有一個按鈕,它指向兩個活動狀態。 誰先走了? IBAction或ViewDidLoad

2)IBAction

1)SecondVC

override func viewDidLoad() { 
    super.viewDidLoad() 
    subjectPickerView.dataSource = self 
    subjectPickerView.delegate = self 
    SwiftyRequest() 
    // Used the text from the First View Controller to set the label 
} 

func SwiftyRequest(){ 
    print("SecondViewController METHOD BEGINS") 
    let jsonobj = UserDefaults.standard.object(forKey: "PostData") 
    let json = JSON(jsonobj as Any) 
     for i in 0 ..< json.count{ 
      let arrayValue = json[i]["name"].stringValue 
      print(arrayValue) 
      self.subjects.append(arrayValue) 
      self.subjectPickerView.reloadAllComponents() 
     } 
    print(self.subjects) 
} 
FirstVC

@IBAction func buttonPressed(_ sender: Any) { 

    Alamofire.request("http://localhost/AIT/attempt3.php",method: .post, parameters: ["something": semValue, "branch" : streamValue]) 
     .responseJSON { response in 
      print(response.result) 

      if let JSON1 = response.result.value { 
       print("Did receive JSON data: \(JSON1)") 
       // JSONData.someData = JSON1 as AnyObject? 
       UserDefaults.standard.set(JSON1, forKey: "PostData") 
       UserDefaults.standard.synchronize() 
      } 
      else { 
       print("JSON data is nil.") 
      } 

    } 
} 

現在,每當我按下按鈕,它的FirstVCIBAction這是有點問題的前調用的SecondVCviewDidLoad我應用程序!我如何確定這兩個函數之間的優先級。

+0

你有沒有鏈接到'Storyboard'?總是首先調用viewDidLoad方法。因爲它是生命週期VC – PiyushRathi

+0

延遲*的主要原因是Alamofire請求的異步行爲。無論如何,強烈建議不要使用'UserDefaults'在控制器之間傳遞數據。 – vadian

+0

您不應該關注這些函數被調用的順序。你應該按照這樣的方式編寫它們*無關緊要*它們被稱爲 –

回答

0

你必須考慮你想要發生什麼。顯然Alamofire電話會花費一些時間。在這段時間過後,你想用第二個VC做些什麼?如果通話根本不返回,你想怎麼做?

這是依賴外部資源時的常見問題。你如何管理用戶界面?你是否在部分狀態下呈現用戶界面?你把一個popover的東西說成像「加載」一樣。還是等待資源完成才能提交第二個VC?

我們不能爲您做出這個決定,因爲它取決於您的要求。儘管如此,還是有各種方法可以實施。如果資源通常很快響應,您可以將VC顯示爲部分狀態,然後將其填充到某種回調中。通常,回叫是(1)塊(2)委託方法或(3)通知。還有(不太常見的)(4)KVO。你應該研究每個的優缺點。