3

在我正在进行的一个项目中,我们有多个持久存储,并且在实体上定义了获取的属性,以提供对不同存储中的对象的访问。

当我运行Editor->Create NSManagedObject Subclass时,获取的属性不会填充到子类中,因此无法在使用此实体的不同控制器中访问。

我的好奇心是如何在子类中定义这些对象以便可以使用它们。

例如,假设我在下面有一个名为“Some Object”的对象,并且该对象上有一个名为“imageFile”的获取属性(File 对象位于不同的存储中,因此无法直接引用)

class SomeObject: NSManagedObject {

   @NSManaged var name: String
   @NSManaged var id: String
   @NSManaged var imageID: String
   @NSManaged var imageFile: File             //Not generated automatically like the rest
}

不幸的是,上述尝试失败并出现以下错误:

无法识别的选择器发送到实例 0x60800865de50

所以我的问题很简单,就是你如何访问 Fetched Properties,或者引用它们的语法是什么。

请不要回答说“不要使用提取的属性”或“只使用一个持久性存储”。我已经知道如何使用正常的关系并且想知道如何利用 Core Data 的这个特性。提前致谢!

更新

尝试下面发布的一些解决方案,我遇到了一些可能有帮助的有趣信息。我使用“po someObject”打印出对象,并惊讶地在数据属性下的输出中看到以下内容:

imageFile = "<relationship fault: 0x618000043930 'imageFile'>";
imageID = "some Id"

但是,当尝试使用 someObject.imageFile 访问 imageFile 时,我无法访问它。使用 valueForKey["imageID"] 我可以获得参考,但每次都无法转换为 File。打印出对象时,我得到:

Optional(Relationship fault for (<NSFetchedPropertyDescription: 0x6180000e1780>), name imageFile, isOptional 1, isTransient 1, entity SomeObject...

最终更新

valueForKey["imageID"]触发故障并获取属性,我在我的xcdatamodelid文件中翻转了属性,这就是为什么它一开始没有找到它。

4

2 回答 2

3

在 Objective-C 中,您可以@dynamic在 on 的类别中定义一个属性文件SomeObject,但 Swift 中不存在类似的东西(据我所知)。

所以唯一的可能是使用键值编码来检索获取的属性(它总是表示为一个数组):

if let files = yourObject.valueForKey("imageFile") as? [File] {
    // ...
}

当然,您可以按照@gutenmorgenuhu 的回答中的建议将其包装到计算属性中。

于 2015-05-09T21:09:05.017 回答
2

如果要将其添加到与 NSManagedObject 相同的类中,可以使用扩展功能:

extension SomeObject{
  var imageFile: String {
    get {// Code to return your fetchedProperty
    }
  }
}
于 2015-05-09T20:33:54.077 回答