【问题标题】:How to implement/augment Core-Data relationship getter/setter?如何实现/增强核心数据关系 getter/setter?
【发布时间】:2010-11-08 01:30:59
【问题描述】:

我有一个相当复杂的托管数据模型,它有一个具有许多关系的中心对象,这些关系取决于各种属性的值。我使用 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”未声明(在此函数中首次使用)

我的问题是我想做的可能或更有可能做的事情,有没有更好的方法来完成这个?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多