如何实现/增强核心数据关系获取器/设置器?

问题描述 投票:2回答:2

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

我想修改用于关系的吸气剂,以自动获取受属性约束的对象。这里的理由是将建立关系的对象移到托管对象中,再移出导入逻辑,但是我无法如愿以偿,例如:

假想的子类化ManagedObject.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”(此功能首次使用)

我的问题是我想做些什么或可能做些什么,是否有更好的方法来做到这一点?

iphone iphone-sdk-3.0 core-data
2个回答
3
投票

这很尴尬。我在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。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.