如何清除核心数据?

问题描述 投票:0回答:1
func clearConversationList() { objc_sync_enter(self) defer { objc_sync_exit(self) } let fetchRequest: NSFetchRequest<PersistentConversationDataItem> = PersistentConversationDataItem.fetchRequest() let cachedResults = try! coreDataContext.fetch(fetchRequest) cachedResults.forEach { coreDataContext.delete($0) } save() } class Manager { let coreDataContext: NSManagedObjectContext init(withContext context: NSManagedObjectContext = CoreDataManager.shared.viewContext) { coreDataContext = context } func save() { DispatchQueue.main.async { if self.coreDataContext.hasChanges { do { try self.coreDataContext.save() } catch { if let error = error as NSError? { print("U \(error), \(error.userInfo)") } } } } } }

崩溃消息:***由于未捕获的异常“NSGenericException”而终止应用程序,原因:“***集合
在枚举时发生了变化。”

<__NSCFSet: 0x600000e76880>

您正在迭代
ios swift core-data
1个回答
0
投票
并通过删除对象来修改

coreDataContext

。如果 
cachedResults
 由受这些删除影响的集合支持,这可能会导致问题。
要解决此问题,您可以尝试几种方法:

使用集合的副本进行迭代
  1. 创建要迭代的集合的副本,以便修改原始集合不会影响迭代。
let resultsCopy = Array(cachedResults) resultsCopy.forEach { coreDataContext.delete($0) }

避免使用 forEach 进行变异操作
  1. 不要使用 forEach,而是使用标准的 for 循环,这可能会在这种情况下更好地处理突变。
for item in cachedResults { coreDataContext.delete(item) }


© www.soinside.com 2019 - 2024. All rights reserved.