【问题标题】:CoreData Object typing won't workCoreData 对象类型不起作用
【发布时间】:2012-09-05 12:38:21
【问题描述】:

有人可以向我解释为什么这不起作用:

CoreDataClass *classObject = (CoreDataClass *)[some method that returns a dictionary with exact KVC pairs that match CoreDataClass];

NSString *myString = classObject.stringProperty;

但这确实:

CoreDataClass *classObject = (CoreDataClass *)[some method that returns a dictionary with exact KVC pairs that match CoreDataClass];
NSString *myString = [classObject valueForKey:@"stringProperty"];

编辑: 将字典转换为我的 NSManagedObjectClass CoreDataClass 以便我可以直接访问属性的最简单方法是什么?

【问题讨论】:

  • 您将字典转换为一些非常不同的类并期望它能够工作?祝你好运!
  • 它们没有区别,类具有相同的 KVC 对。将符合 KVC 的字典转换为匹配的 NSManagedObject 类的最快等待时间是多少?

标签: iphone core-data properties nsmanagedobject


【解决方案1】:

它不起作用,因为 KVC 合规性根本不是定义类或使它们可转换的东西 - 类层次结构的存在是有原因的,仅仅确保遵守某些方法并不会神奇地使某些东西成为完全不同的实例班级。请记住,点访问器语法只是方法发送的糖,所以这两个是等价的:

  • classObject.stringProperty
  • [classObject stringProperty]

...而后者显然对 NSDictionary 的实例无效(即 [[NSDictionary class] instancesRespondToSelector:@selector(stringProperty)]NO)。

您的后一个示例之所以有效,是因为您的问题的前提是:如果某个键符合 KVC 标准 stringProperty,并且您要求它为该键提供一个值,那么显然您会得到一些回报。此外,NSDictionary 和 CoreDataClass 都响应选择器-valueForKey:,因此消息发送实际上在运行时起作用。

将两者结合起来的最佳方式根本不是“强制转换”,而是在属性级别对所涉及的数据进行完全转换。您可以考虑在 CoreDataClass 上创建一个自定义的 -initWith... 方法,让您可以从字典中实例化其属性,或者找到一种方法让您的方法返回 CoreDataClass 的实际实例而不是 NSDictionary。

请注意,此解决方案可能与获取数据的“最简单”方式不同,后者有效地继续做你正在做的事情并使用-valueForKey:(尽管最好不使用演员表,这是误导)。

【讨论】:

    【解决方案2】:

    仅转换对象似乎可以工作(在某种意义上,您不会遇到类型检查错误),因为它是对编译器的提示,但它实际上并没有改变任何关于指针指向,所以你仍然指向一个 NSDictionary。这是因为,归根结底,您实际上是将指针转换为指针,但告诉 Xcode 您可以向它发送一组不同的选择器。

    对于 NSManagedObjects,从字典创建取决于一些事情,但推荐的方法是在您的自定义类上创建一个类方法,该方法将使用 NSEntityDescription 和您的 NSManagedObjectContext,并将字典中的属性设置为对象:

    +(CoreDataClass *) coreDataObjectWithDictionary:(NSDictionary *) spec {
      CoreDataClass *myInstance = [NSEntityDescription insertNewObjectForEntityForName: @"CoreDataClass" inManagedObjectContext: [myMOCProvider sharedMOC];
      myInstance.someProp = [spec valueForKey:@"someProp"];
    } 
    

    【讨论】:

    • 那么上面的方法让我在 MOClass 中插入一条记录,这样我就可以直接作为类访问它了?
    • 它使用托管对象上下文来管理新对象与存储的关系,它使用MOC配置的modelpersistent store来知道构建什么以及如何将其插入到您的数据库中。所以最终结果(例如,如果您使用 SQLite)是为该实体创建了您配置的类的新对象,并且当您保存 MOC 时,将在您的 SQL 存储中插入一行。将来,您可以/应该使用 NSFetchRequest 而不是此方法加载该对象,这会复制它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2023-03-30
    • 2023-04-11
    • 2017-03-15
    相关资源
    最近更新 更多