0

最近我接手了一个基于 Core Data 的现有 iOS 项目的开发。该项目使用后台同步从服务器检索和更新数据并将其写入核心数据。但是,在某些情况下,这会导致以下块崩溃:

context.perform {
   print("Replacing \(type) \(serverId)")

   var modifiedObject = modifiedObject
   modifiedObject.serverId = serverId
   modifiedObject.modified = false


   do {
       try context.save()
   }
   catch {
       print(error)
       print("could not save context")
   }

   fulfill(())
}

上述块的上下文是较早在后台上下文中创建的:

let context = self.persistentContainer.newBackgroundContext()
context.mergePolicy = NSMergePolicy(merge: 
NSMergePolicyType.mergeByPropertyStoreTrumpMergePolicyType)
context.stalenessInterval = 0

该应用程序不会在 catch 块中引发错误,但在访问上下文时会停止工作。找不到进一步的日志详细信息。

在我见过的大多数 Core Data 示例中,persistentContainer.viewContext被使用或newBackgroundContext()用于后台操作。在这个应用程序中,在主线程上,应用程序默认使用注册到对象本身的上下文。请参见以下示例:

self.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: location.managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)

属性的值managedObjectContext是注册到对象的上下文。因此,我的假设是值发生了变化,因此使用了不正确的上下文。我认为这会导致线程访问问题。

当直接使用注册的上下文时,是否有其他人遇到过这些问题,您是如何解决的?

4

0 回答 0