CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象

Posted

技术标签:

【中文标题】CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象【英文标题】:CoreData fetch request returns an object with nil properties when changing app state 【发布时间】:2021-12-24 20:05:23 【问题描述】:

我有一些代码可以帮助管理当前的托管对象上下文

var currentContext: NSManagedObjectContext 
    if Thread.isMainThread 
        return mainContext
     else 
        return backgroundContext
    


var mainContext: NSManagedObjectContext 
    return persistentContainer.viewContext


lazy var backgroundContext: NSManagedObjectContext = 
    let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    context.parent = mainContext
    
    return context
()

获取函数

public func entities(_ fetchOptions: FetchOptions) -> [T] 
    let fetchRequest = NSFetchRequest<T>(entityName: T.entityName)
    
    switch fetchOptions 
    case let .filtered(predicate):
        fetchRequest.predicate = predicate
    case let .sorted(sortDescriptors):
        fetchRequest.sortDescriptors = sortDescriptors
    case let .filteredAndSorted(predicate, sortDescriptors):
        fetchRequest.predicate = predicate
        fetchRequest.sortDescriptors = sortDescriptors
    case .all:
        fetchRequest.sortDescriptors = []
    
    
    fetchRequest.returnsObjectsAsFaults = false
    
    let context = CoreDataContextProvider.provider.currentContext
    
    return (try? context.fetch(fetchRequest)) ?? []

假设我有一个从服务器获取一些数据并将其写入 CoreData 的请求。当我在前台使用该应用程序时,一切正常,但是当我进入后台时,例如,切换到另一个应用程序,然后返回,从当前上下文中获取特定实体的请求返回类似

SomeEntity 
   var property1 = 0;
   var property2 = nil;
   var property3 = nil;
   ... etc

数据在后台上下文中是正确的,并且在切换回主上下文后我得到了这种行为。

我尝试在 UIApplication.didEnterBackgroundNotificationUIApplication.willEnterForegroundNotification 上保存当前上下文,因此无论如何都会推送更改,但它似乎没有任何帮助。

另外,我尝试在NSManagedObject.didSaveObjectsNotification 上合并主上下文和背景上下文,得到了相同的结果,但我不排除我在这里做错了什么。

当我只使用主上下文时,一切似乎都运行良好,但我偶尔会遇到严重的 UI 冻结。

【问题讨论】:

【参考方案1】:

解决方案是让主上下文为我做这些合并的事情,实际上有一种方法可以创建新的背景上下文而不会让人头疼:

persistentContainer.newBackgroundContext()

现在一切正常

【讨论】:

以上是关于CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象的主要内容,如果未能解决你的问题,请参考以下文章

Spotify web api 在获取播放列表请求时返回状态 500

当您知道没有保存实体时如何处理 CoreData 中的获取请求

如何在 segue 中从 CoreData 获取结果

在 CoreData 中执行获取请求的最佳方法是啥?

更改 App 当前的 CoreData 源

iOS 5.1:在 NSManagedObjectContext 保存时获取“CoreData:错误:(21)”