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

Swift中CoreData读取函数先于保存函数执行的问题排查

CoreData数据保存后无法加载到UITableView的问题排查与修复

核心问题分析

你的问题根源在于异步任务的执行顺序错误:

  • processCirclCVEs中的Task是异步执行的,网络请求和CoreData数据插入操作不会阻塞当前线程。你在Task外部提前调用了retrieveCVEDaily,此时数据还未写入CoreData,自然读不到内容。
  • viewDidLoad里的retrieveCVEDaily也会在异步任务完成前执行,同样无法获取到新插入的数据。

具体错误点

  1. processCirclCVEs函数中,Task块外的retrieveCVEDaily()调用时机过早,异步数据插入还未完成。
  2. viewDidLoad中最后调用的retrieveCVEDaily(),同样在异步任务结束前执行,读取的是空数据。

修复方案

将retrieveCVEDaily()移到Task块的最后,确保所有数据写入CoreData后再读取并刷新表格:

修改processCirclCVEs函数

func processCirclCVEs()
{
    let cdCRUD = CRUD()
    let oCirclCVEs = CirclCVEs()
    
    Task
    {
        await oCirclCVEs.jsonDataRequest()
        
        self.txtvJSON.text = self.txtvJSON.text + "CirclCVEs\n"
        txtvJSON.text = "Array elements: " + String((oCirclCVEs.arrCVE?.results.count)!)
        
        var strID : String
        var strCVSS : String? = nil
        var strModified : String
        var strSummary : String
        var strCVEs : String = ""

        for eachCVE in oCirclCVEs.arrCVE!.results
        {
            strID = eachCVE.id
            strCVSS = eachCVE.cvss != nil ? String(eachCVE.cvss!) : ""
            strModified = eachCVE.Modified
            strSummary = eachCVE.summary

            strCVEs = strCVEs + strID + " - " + strCVSS! + "\n"
            cdCRUD.cdCreate(pcveNumber: strID, pcveCVSS: 0.0, pcveDate: strModified, pcveDescription: strSummary)
            print("Created")
        }

        self.txtvJSON.text = self.txtvJSON.text + strCVEs
        // 数据插入完成后再读取并刷新表格
        self.retrieveCVEDaily()
    }
    // 删除此处的retrieveCVEDaily()调用
}

修改viewDidLoad函数

override func viewDidLoad() {
    super.viewDidLoad()
    initImages()
    tvwCVEDaily.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    
    clearCoreData()
    processCirclCVEs()
    // 删除此处的retrieveCVEDaily()调用
}

额外优化建议

  • 避免使用强制解包(!),改用可选绑定(如if let arrCVE = oCirclCVEs.arrCVE { ... }),防止空值崩溃。
  • 大量数据插入CoreData时,建议在专用的上下文队列执行操作,避免阻塞主线程。
  • 可以使用NSFetchedResultsController自动监听CoreData数据变化,实现表格的自动刷新,无需手动调用reloadData()。

内容的提问来源于stack exchange,提问作者sugarakis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:10:42