2016-12-14 59 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。你应该研究每个的优缺点。