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.didEnterBackgroundNotification
和 UIApplication.willEnterForegroundNotification
上保存当前上下文,因此无论如何都会推送更改,但它似乎没有任何帮助。
另外,我尝试在NSManagedObject.didSaveObjectsNotification
上合并主上下文和背景上下文,得到了相同的结果,但我不排除我在这里做错了什么。
当我只使用主上下文时,一切似乎都运行良好,但我偶尔会遇到严重的 UI 冻结。
【问题讨论】:
【参考方案1】:解决方案是让主上下文为我做这些合并的事情,实际上有一种方法可以创建新的背景上下文而不会让人头疼:
persistentContainer.newBackgroundContext()
现在一切正常
【讨论】:
以上是关于CoreData 获取请求在更改应用程序状态时返回具有 nil 属性的对象的主要内容,如果未能解决你的问题,请参考以下文章
Spotify web api 在获取播放列表请求时返回状态 500