当上下文为 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

当 AVAudioPlayer URL 为 nil 时停止崩溃?

Swift Share 扩展,ALAsset 为 nil

变量显示为 nil - swift 4 IOS

Swift 物理致命错误:当两个字符发生碰撞时,在展开可选值时意外发现 nil