代码之家  ›  专栏  ›  技术社区  ›  Erik

如何实现/增强核心数据关系getter/setter?

  •  2
  • Erik  · 技术社区  · 15 年前

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

    我想修改关系的getter,以自动获取受属性约束的对象。这里的理由是将关系构建移动到托管对象中,并从导入逻辑中移除,但我无法实现这一点,例如:

    -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)
    

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Erik    15 年前

    这很尴尬。我在苹果的网站上找到了我问题的答案 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;
    }
    

        2
  •  1
  •   glotcha    5 年前

    谢谢Erik,10年后,文档已经下载了。这是我想出的swift(计算属性)代码

    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:))
        }
      }
    

    UnregularUse是一个结构,MIrregularUse是它的NSManagedObject等价物。我不确定是否需要设置谓词,没有谓词它似乎可以正常工作。