当上下文为 nil 时,Swift Temp CoreData 对象无法设置 ivars
Posted
技术标签:
【中文标题】当上下文为 nil 时,Swift Temp CoreData 对象无法设置 ivars【英文标题】:Swift Temp CoreData object can not set ivars when context is nil 【发布时间】:2016-05-14 06:12:07 【问题描述】:我有一个 CoreData 对象,我想实例化(临时使用),但我不想保存或插入上下文以实现持久性。
我想创建的对象的类定义如下:
import Foundation
import CoreData
@objc(USubmission)
class USubmission: NSManagedObject
@NSManaged var subid: NSNumber
我这样创建对象(暂时使用但不持久)
let entitiyDesc = NSEntityDescription()
entitiyDesc.name = "USubmission"
entitiyDesc.managedObjectClassName = "USubmission"
let sub = USubmission.init(entity: entitiyDesc, insertIntoManagedObjectContext: nil)
但是,当我设置一个临时对象的 ivars 时,我收到以下错误:
sub.subid = 0
错误:
[USsubmission setSubid:]: 无法识别的选择器发送到实例
我检查了对象,它看起来像是正确的对象,而不是 NSManagedObject 对象。
当上下文为 nil(临时对象)而不是有上下文时,为什么会出现此错误?
【问题讨论】:
正如@messeb 在下面的回答中指出的那样,问题源于实体描述。您从头开始创建它,它与模型中提供的定义不同(尽管它具有相同的名称和模型类)。在entityForName:inManagedObjectContext:
类方法中指定上下文提供了模型的链接(上下文 -> psc -> 模型)。
【参考方案1】:
您必须从 ManagedObjectContext 创建实体描述:
let entitiyDesc = NSEntityDescription.entityForName("USubmission", inManagedObjectContext: **yourContext**)
如果您不想保存使用实体创建的对象,则将 nil 传递给 insertIntoManagedObjectContext,就像您已经做的那样:
let sub = USubmission.init(entity: entitiyDesc, insertIntoManagedObjectContext: nil)
【讨论】:
就是这样!只需要为 NSEntityDescription 传递一个有效的上下文,它现在就可以工作了。谢谢你的帮助!!以上是关于当上下文为 nil 时,Swift Temp CoreData 对象无法设置 ivars的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3:当孩子存在时,FirebaseDB 返回 nil
Swift - 带有 xib 文件的自定义视图,IBOutlet 为 nil