2

我有一个相当复杂的托管数据模型,它有一个具有许多关系的中心对象,这些关系取决于各种属性的值。我正在使用 plist 集将初始数据导入模型,每个 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 行编译时崩溃了:

错误:“relation1”未声明(在此函数中首次使用)

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

错误:“attr1”未声明(在此函数中首次使用)

我的问题是我想做的可能或更可能,有没有更好的方法来实现这一点?

4

2 回答 2

3

嗯,这是尴尬。我在 Apple 的文档中找到了我的问题的答案。

因此,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。

于 2009-07-04T04:25:14.000 回答
1

感谢 Erik,10 年后,文档已关闭。这是我想出的快速(计算属性)代码

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 等价物。我不确定是否需要设置谓词,没有它似乎可以正常工作。

于 2020-01-31T06:54:25.510 回答