Swift中如何通过ManagedObjectID获取Core Data托管对象?
Swift中通过NSManagedObjectID获取托管对象的正确方式
问题分析
- 你使用的
registeredObject(for:)方法仅返回已在当前上下文内存中注册的对象,如果目标对象尚未被加载到内存,会返回nil——这就是你代码进入不了分支的原因。Objective-C的objectRegisteredForID:和Swift的这个方法行为完全一致,原OC代码能找到对象的前提是当时对象已经在内存中。 - ChatGPT给出的代码错误在于
NSManagedObjectID没有接受字符串的初始化方法,无法直接通过字符串创建实例。
正确实现步骤
要可靠获取托管对象(无论是否已加载到内存),需分两步:
- 将字符串形式的ID(通常是对象的URI表示)转换为
NSManagedObjectID实例 - 使用Core Data上下文的
existingObject(with:)或object(with:)方法获取对象(后者在对象不存在时返回nil,前者会抛出错误)
代码示例
假设self.latestcontactid是对象URI的字符串形式:
guard let contactIDStr = self.latestcontactid, let uriURL = URL(string: contactIDStr), let managedObjectID = self.managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: uriURL), let myContact = try? self.managedObjectContext.existingObject(with: managedObjectID) as? Contacts else { // 处理ID无效、对象不存在或加载失败的情况 return } // 在此处使用myContact
方法说明
persistentStoreCoordinator?.managedObjectID(forURIRepresentation:):将URI字符串转换为有效的NSManagedObjectID,只有当URI对应持久化存储中的有效对象时才会返回非nil值。existingObject(with:):从持久化存储中加载对象(如果不在内存中),若对象不存在会抛出错误,适合需要确保对象存在的场景;如果不需要抛出错误,可改用object(with:),但该方法在对象不存在时会返回nil。
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

