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可能会更快地教您基础知识。