You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者이원석

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:48:02