ios - 解码为 NSManagedObject 对象后需要获取请求
问题描述
我有以下通用函数:它正确地创建了对象,我知道它被保存到核心数据中,因为如果在之后立即执行获取请求,我会得到我刚刚创建的对象。但是,对象本身不是有效的核心数据对象(x 核心数据错误)。有什么办法让我不必在解码对象后立即执行获取请求吗?非常感谢。
func decode<T: Decodable>(data: Data?, objectType: T.Type, save: Bool = true, completionHandler: @escaping (T) -> ())
{
guard let d = data else { return }
do
{
let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateContext.parent = SingletonDelegate.shared.context
let root = try JSONDecoder(context: privateContext).decode(objectType, from: d)
if save
{
try privateContext.save()
privateContext.parent?.performAndWait
{
do
{
if let p = privateContext.parent
{
try p.save()
}
}catch
{
print(error)
}
}
}
DispatchQueue.main.async
{
completionHandler(root)
}
}catch
{
print(error)
}
}
extension CodingUserInfoKey
{
static let context = CodingUserInfoKey(rawValue: "context")!
}
extension JSONDecoder
{
convenience init(context: NSManagedObjectContext)
{
self.init()
self.userInfo[.context] = context
}
}
解决方案
核心数据故障是有效的核心数据对象;它只是还没有从后备存储中检索到内存中。
为了减少内存使用,Core Data 仅在您访问其属性之一时获取完整对象。此获取是自动的,并且对您的代码有效透明。
这意味着您不需要做任何特别的事情;您可以只使用托管对象。
推荐阅读
- python - 熊猫数据框中的产品评分
- javascript - 在自定义反应钩子中使用 fetch() 的无限循环
- azure - Workitems 单行查询父子列
- python - 如何在heroku数据库上加载python列表
- qt - Qt 3D Studio 仅对幻灯片中的一个元素进行动画处理,同时保持其他元素保持原位
- python - 键盘中断 PyCharm 窗口
- python - Python 文档中“mixin 方法”的含义
- python - 当我求幂时,程序抛出值错误,Python 3
- spring-boot - Keycloak:将 ldap 组映射到 springboot 角色
- r - 错误:在 gtsummary 中使用 srvyr 和 tbl_svysummary 时,$ 运算符对原子向量无效