如何实现/扩充Core-Data关系getter / setter?

时间:2009-07-04 04:06:05

标签: iphone iphone-sdk-3.0 core-data

我有一个相当复杂的托管数据模型,它有一个中心对象,有许多关系,这取决于各种属性的值。我使用plists集将初始数据导入模型,每个plist指定实体类的属性,然后根据这些属性填充关系。

我想修改关系的getter,以自动获取受属性约束的对象。这里的推理是将关系构建移动到托管对象和输入逻辑之外,但我无法实现这一目标:

假设SubclassedManagedObject.m:

-1 #import "SubclassedManagedObject.h'
0 #import "OtherManagedObject.h"

1 @implementation SubclassedManagedObject
2 @dynamic attr1
3 @dynamic relation1  // which is an OtherManagedObject

4 - (OtherManagedObject *)relation1
5 {
6     if( relation1 != nil)
7        return relation1;

8     NSFetchRequest *request = [[NSFetchRequest alloc] init];
9     [request setEntity://the OtherManagedObject entity];
A     [request setPredicate://predicate based on attr1];

B     NSArray *results;
C     results = [[self managedObjectContext] executeFetchRequest:request//..];

D     if( [results count] )
E       relation1 = [results objectAtIndex:0];
F }

在第6行编译时会爆炸:

error: 'relation1' undeclared (first use in this function)

并在A行,根据attr1的值构建谓词:

error: 'attr1' undeclared (first use in this function)

我的问题是我想做什么或更有可能,有没有更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:2)

这很尴尬。我在Apple的documentation中找到了我的问题的答案。

所以relation1的getter的实现改为:

- (OtherManagedClass *)relation1
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:// the entity];
    [request setPredicate:// predicate using attr1];
    NSArray *results
    results = [[self managedObjectContext] executeFetchRequest:// ...];
    if( [results count] )
        return [results objectAtIndex:0];
    return nil;
}

我的错误是将这些属性视为传统的ivars。

答案 1 :(得分:1)

感谢Erik,十年后,文档被删除了。这是我想出的快速(计算属性)代码

var irregularUses: [IrregularUse]? {
    get {
        let fetchRequest = NSFetchRequest<MIrregularUse>(entityName: "MIrregularUse")
        guard let managedUses = try! managedObjectContext?.fetch(fetchRequest) else { return nil }
        return managedUses.map(IrregularUse.init(managed:))
    }
  }

IrregularUse是一个结构,MIrregularUse是其NSManagedObject等效项。我不确定是否需要设置谓词,如果没有的话,它似乎可以正常工作。