【问题标题】:Who came first? IBAction or ViewDidLoad谁先来的? IBAction 或 ViewDidLoad
【发布时间】:2016-12-14 13:26:16
【问题描述】:

我在第一个 VC 上有一个按钮,它指向两个活动状态。

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)
}

2) IBActionFirstVC

@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.")
            }

    }
}

现在,每当我按下按钮时,它都会在 IBActionFirstVC 之前调用 viewDidLoadSecondVC,这对我的应用程序来说有点问题!我如何确定这两个功能之间的优先级。

【问题讨论】:

  • 你把它链接到Storyboard了吗?总是首先调用 viewDidLoad 方法。因为它是生命周期VC
  • 延迟的主要原因是Alamofire请求的异步行为。无论如何,强烈建议您不要使用 UserDefaults 在控制器之间传递数据
  • 您不应该关注调用这些函数的顺序。你应该以这样的方式编写它们,使得它们被调用的顺序不重要
  • 1) 你的问题毫无意义。按下FirstVC 中的按钮与SecondVC 有什么关系? buttonPressed 中没有创建或加载 SecondVC 的代码。 2)不要使用UserDefaults来存储数据。那不是它的目的。 3) 不要无谓地拨打synchronize

标签: ios json swift


【解决方案1】:

你必须考虑你想要发生什么。显然,Alamofire 通话需要一些时间。这段时间过去了,你想对第二个 VC 做什么?如果电话根本没有返回,你想做什么?

这是依赖外部资源时的常见问题。你如何管理用户界面?您是否以部分状态呈现 UI?您是否放置了一个弹出框,上面写着“正在加载”之类的内容。或者您是否等待资源完成后再展示第二个 VC?

我们无法为您做出决定,因为这取决于您的要求。不过,有很多方法可以实现每一个。如果资源通常快速响应,您可以将 VC 显示为部分状态,然后在某种回调中填充它。通常回调是​​(1)块(2)委托方法或(3)通知。还有(不太常见)(4)KVO。您可能应该研究每种方法的优缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多