如何在Swift中实例化代码生成的NSManagedObject且不插入至上下文?
在Swift中实例化NSManagedObject但不插入上下文的实现方法
因为Swift自动生成的NSManagedObject子类初始化方法要求必须传入上下文,没法直接像Objective-C那样空初始化,你可以通过以下两种方式实现:
直接调用NSManagedObject的指定初始化器
利用NSManagedObject自带的init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)方法,其中insertInto参数支持传nil,这样创建的对象就不会被自动插入到上下文里。示例代码:
// 先从已有上下文获取对应实体的描述 guard let entity = NSEntityDescription.entity(forEntityName: "你的实体名", in: 你的上下文对象) else { fatalError("找不到对应实体") } // 传入nil不插入上下文 let uninsertedObject = 你的实体类(entity: entity, insertInto: nil)给子类添加便利初始化器
为了简化调用,可以给你的NSManagedObject子类扩展一个便利初始化方法,避免重复写实体描述的获取逻辑:示例代码:
extension 你的实体类 { convenience init(from context: NSManagedObjectContext) { let entityName = String(describing: Self.self) guard let entity = NSEntityDescription.entity(forEntityName: entityName, in: context) else { fatalError("实体\(entityName)不存在") } self.init(entity: entity, insertInto: nil) } } // 使用方式 let uninsertedObject = 你的实体类(from: 你的上下文对象)
如果之后需要把这个对象插入到上下文,只需要调用你的上下文对象.insert(uninsertedObject)即可,和Objective-C的操作逻辑完全一致。
内容的提问来源于stack exchange,提问作者John Cashew
相关产品推荐
相关产品推荐

