我有一个相当复杂的托管数据模型,它有一个中心对象,有许多关系,这取决于各种属性的值。我使用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)
我的问题是我想做什么或更有可能,有没有更好的方法来实现这个目标?
答案 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等效项。我不确定是否需要设置谓词,如果没有的话,它似乎可以正常工作。