swift NSManagedObject 子类初始化问题

Posted

技术标签:

【中文标题】swift NSManagedObject 子类初始化问题【英文标题】:swift NSManagedObject subclass initialization issue 【发布时间】:2014-12-31 10:45:08 【问题描述】:

我正在制作一个新应用程序,我决定尝试快速开发它。 我正在使用 CoreData,我猜我有一个奇怪的行为。

我正在像这样创建一个新项目(NSManagedObject 子类):

   let managedObjectContext: NSManagedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!

   self.newItem = NSEntityDescription.insertNewObjectForEntityForName("Item", inManagedObjectContext: managedObjectContext) as Item

   self.newItem.setValue(NSDate(), forKey: "startDate")

当我打印 startDate 时,它​​总是为零。与项目的属性相同(链接到其他对象)。

在调试器中,对象 (newItem) 似乎被很好地实例化(我看到 (myapp.Item!) 作为对象类型),但调试器似乎对 CoreData 并不是真正的用户友好。我发现无法像在 ObjectiveC 中那样检查或打印所有对象的属性。

这里有什么我遗漏的吗?实例化对我来说似乎很正确,不是吗?

谢谢。

【问题讨论】:

【参考方案1】:

您在调试器中看到对象类型这一事实并不意味着该对象已正确初始化。它很可能只是向您显示您在定义self.newItem 时在类中声明的类型。

我同意,Swift 调试器有很多不足之处。除非您想学习更高级的调试器命令,否则您不能依赖它来调试这种情况,但是如果您将日志语句插入代码中,输入的内容也一样多。

检查并确认

您的托管对象上下文不是nil 您的插入方法确实创建了一个正确的Item 对象,它不是nil Item 实体的托管对象子类已正确配置

也许您想先尝试创建一个新的本地 Item 变量,然后再将其分配给 self.newItem 以消除任何 ivar 错误。

如果您保存上下文,请尝试查看是否有任何变化。

尝试习惯于使用子类属性访问属性,例如newItem.startDate,而不是依赖容易出错的valueForKey 方法。

【讨论】:

感谢您的回答。实际上它有点奇怪。当我打印 iVar 值(在调试器中使用 po)时,在我设置它们之后它们都为零。但几秒钟后,它们似乎被填满了。真的很奇怪。由于编译器/调试器问题,它是 swift/CoreData 行为吗? 请使用printfNSLog查看变量内容。

以上是关于swift NSManagedObject 子类初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 无法正确“创建 NSManagedObject 子类”Swift

NSManagedObject 子类在 swift 中初始化失败

“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?

将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来

swift NSManagedObject 子类初始化问题

如何在 swift 中将子类 NSManagedObject 分配给 var(而不是常量)