Swift中CoreData读取函数先于保存函数执行的问题排查
CoreData数据保存后无法加载到UITableView的问题排查与修复
核心问题分析
你的问题根源在于异步任务的执行顺序错误:
processCirclCVEs中的Task是异步执行的,网络请求和CoreData数据插入操作不会阻塞当前线程。你在Task外部提前调用了retrieveCVEDaily,此时数据还未写入CoreData,自然读不到内容。viewDidLoad里的retrieveCVEDaily也会在异步任务完成前执行,同样无法获取到新插入的数据。
具体错误点
processCirclCVEs函数中,Task块外的retrieveCVEDaily()调用时机过早,异步数据插入还未完成。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
相关产品推荐
相关产品推荐

