Swift中如何在目标视图加载前触发prepare for segue方法?
问题根源
你遇到的执行顺序异常是因为 getDocuments 是Firestore提供的异步网络请求方法,它的回调闭包不会阻塞主线程执行:
prepare方法本身确实会在目标VC的viewDidLoad之前执行,但你把传值逻辑写在了异步请求的回调中,这个回调需要等Firestore服务器返回数据后才会触发,此时第二个VC早已完成viewDidLoad甚至已经显示到界面上,所以会出现传值逻辑晚于第二个VC加载的现象。
解决方案
给你两种常用的修复方案,可根据业务场景选择:
方案1:提前加载数据,完成后再跳转
在用户触发跳转的操作(比如点击按钮)中先发起Firestore请求,拿到数据后再手动触发segue跳转,保证数据在第二个VC加载前就完成传递:
第一步:修改触发跳转的逻辑
// 原触发跳转的按钮点击方法 @IBAction func goToPostList(_ sender: Any) { // 先发起Firestore请求 db.collection("Posting").getDocuments(){ [weak self] (querySnapshot, err) in guard let self = self else { return } if let err = err { print("获取文档错误: \(err)") return } // 清空原有数据,写入新数据 self.savePostings.removeAll() for document in querySnapshot!.documents { self.savePostings.append(document.data()) } // 切回主线程触发segue跳转 DispatchQueue.main.async { // 这里替换成你自己的segue标识 self.performSegue(withIdentifier: "PostListSegue", sender: nil) } } }
第二步:简化prepare方法,仅做传值
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let vc = segue.destination as! PostingListTableViewController vc.updatedPostings = self.savePostings vc.testPrint = "잉 기모찌" }
该方案跳转后第二个VC直接就能拿到完整数据,不需要额外加loading状态。
方案2:传值后手动刷新第二个VC的列表
如果不想修改现有跳转逻辑,保留在prepare中发起请求的写法,只需要在异步回调传值完成后,手动触发第二个VC的列表刷新即可,注意要切回主线程执行UI操作:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 提前拿到目标VC引用,避免闭包回调时引用异常 let vc = segue.destination as! PostingListTableViewController let docRef = db.collection("Posting").getDocuments(){ [weak self] (querySnapshot, err) in guard let self = self else { return } if let err = err { print("获取文档错误: \(err)") return } for document in querySnapshot!.documents { print("\(document.documentID) => \(document.data())") self.savePostings.append(document.data()) } // 赋值传值 vc.updatedPostings = self.savePostings vc.testPrint = "잉 기모찌" print("배열 전달 확인\n\(vc.updatedPostings)\n\n\(self.savePostings)") // 切回主线程刷新列表 DispatchQueue.main.async { vc.tableView.reloadData() } } }
该方案改动量小,跳转后会先显示空列表,数据返回后自动刷新,建议搭配loading提示优化体验。
注意事项
- 尽量避免强制解包(代码中的
!),对可选值做判空处理,避免数据异常时闪退 - 异步闭包添加
[weak self]捕获列表,避免页面提前退出时出现循环引用内存泄漏
内容的提问来源于stack exchange,提问作者이원석
相关产品推荐
相关产品推荐

