Swift:创建不持久化的NSManagedObject对象问题
解决CoreData中创建NSManagedObject子类非持久化对象的问题
首先得说清楚为什么直接let user = User()会崩溃:CoreData的NSManagedObject子类必须关联一个NSManagedObjectContext才能初始化,系统自动生成的子类默认只有带上下文参数的初始化器,没有无参初始化,所以直接调用无参初始化会因为找不到匹配的初始化方法导致崩溃。
下面给你两种实用的解决方案,按需选择:
方案一:使用临时内存上下文创建对象
创建一个临时的内存上下文,用它来初始化User对象,只要你不主动保存这个临时上下文,对象就不会被持久化到本地存储里,完全满足你的需求:
// 初始化临时内存上下文,和主上下文共享持久化协调器 let tempContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) tempContext.persistentStoreCoordinator = PersistenceService.context.persistentStoreCoordinator // 用临时上下文创建User对象 let user = User(context: tempContext) user.name = "My name" user.address = "My Address"
这个方法的好处是逻辑清晰,你能明确控制对象的生命周期——如果之后想把这个对象持久化,只需要把它的属性复制到主上下文的User对象里,再保存主上下文即可。
方案二:给User类添加无参便捷初始化器
如果你想直接用User()的方式初始化,可以给User类扩展一个便捷初始化器,内部自动创建临时上下文:
extension User { convenience init() { // 创建临时上下文 let tempContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) // 关联主上下文的持久化协调器,保证对象能正常访问CoreData的属性配置 if let coordinator = PersistenceService.context.persistentStoreCoordinator { tempContext.persistentStoreCoordinator = coordinator } // 调用系统的指定初始化器 self.init(context: tempContext) } }
现在你就可以像预期的那样直接创建非持久化对象了:
let user = User() user.name = "My name" user.address = "My Address"
额外提醒
如果之后需要把这个临时对象转为持久化对象,不要直接把临时上下文的对象插入主上下文(会报错),正确的做法是复制属性到主上下文的新对象中:
let persistentUser = User(context: PersistenceService.context) persistentUser.name = user.name persistentUser.address = user.address // 保存主上下文完成持久化 do { try PersistenceService.context.save() } catch { print("保存失败:\(error)") }
内容的提问来源于stack exchange,提问作者user9172697
相关产品推荐
相关产品推荐

