override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    submitTapped()
    if let scheduleController = segue.destination as? ScheduleController {
        scheduleController.jsonObject = self.info
    }
}

在submitTapped()中,为self.info分配了一个值。但是,当我运行我的应用程序时,self.info被报告为“nil”。我尝试在三行中的每一行设置断点,并且似乎直到此函数完成后才会执行submitTapped()。

为什么是这样?是否必须处理线程?我如何才能在其余部分之前执行SubmitTapped()?我只是想从一个视图控制器移动到另一个,同时还将self.info发送到下一个视图控制器。

更新:

由于下面的答案和我自己的测试,我最终弄清了大部分问题。
@IBAction func submitTapped() {
    update() { success in
        if success {
            DispatchQueue.main.async {
                self.performSegue(withIdentifier: "showScheduler", sender: nil)
            }
        }
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // I'll probably check the segue identifier here once I have more "actions" implemented
    let destinationVC = segue.destination as! ScheduleController
    destinationVC.jsonObject = self.info
}

public func update(finished: @escaping (Bool) -> Void) {
    ...
    self.info = jsonObject //get the data I need
    finished(true)
    ...
}

最佳答案

网络请求是一个异步任务,它在后台发生,需要一些时间才能完成。您的prepareForSegue方法调用将在数据从网络返回之前完成。

您应该考虑使用completionHandler,并且仅在拥有数据后才触发segue。

因此,您的SubmitTapped函数(可能最好将其重命名以进行更新或其他操作)将发出网络请求,然后在它返回数据时将设置self.info属性,然后调用performSegueWithIdentifier。

func update(completion: (Bool) -> Void) {
    // setup your network request.
    // perform network request, then you'll likely parse some JSON

    // once you get the response and parsed the data call completion
    completion(true)
}

update() { success in
    // this will run when the network response is received and parsed.
    if success {
        self.performSegueWithIdentifier("showSchedular")
    }
}

更新:

闭包,完成处理程序异步任务起初可能很难理解。我强烈建议您查看此free course,这是我在Swift中学习如何进行操作的地方,但这需要一些时间。

这个video tutorial可能会更快地教您基础知识。

10-07 14:17