Objective-C函数通过指定方法签名中的关系来更新Core Data关系

时间:2013-04-10 08:37:39

标签: ios objective-c oop core-data polymorphism

我有与实体Battery的一对多关系的各种核心数据实体:

Battery-----1-Many-----Comment
Battery-----1-Many-----Measurement
Battery-----1-Many-----Photo

我编写了一个很棒的功能,可以对服务器进行限制,并对关系进行更新,添加和删除。在这里,为“评论”关系编码,为简洁起见,为了简洁而简化:

- (void)updateLocalDataWithClass:(Class)entityClass withSet:(NSSet*)existingRelationships {

  NSMutableSet *entitiesToRemove = [NSMutableSet setWithSet:existingRelationships];

  NSArray *serverObjects = [self getServerObjects];
  for (NSMutableDictionary *serverDict in serverObjects) {

      BaseEntityDO *existingEntity = [self getMatchingEntity:serverDict];
      if (existingEntity) {
          [existingEntity updateAttributesWithData:serverDict];
          [entitiesToRemove removeObject:existingEntity];
      } else {
          BaseEntityDO *newEntity = [entityClass createEntity:serverDict];
          [self addCommentsObject:newEntity];
      }
  }

  [self removeBatteryComments:entitiesToRemove];
}

但是,我不想复制和粘贴此功能三次,稍微修改每个关系。理想情况下,我想“将关系传递给函数”。告诉函数我们正在处理注释,测量或照片关系 - 以及函数使用正确的“addCommentsObject”或“addMeasurementsObject”或“addPhotosObject”。

我需要替换的两行代码是:

  1. [self addCommentsObject:newComment];
  2. [self removeBatteryComments:entitiesToRemove];
  3. 理论上我可以用NSSet替换这两个,但是我仍然需要知道我计划替换的三个中的

    1. self.batteryComments = replacementEntitySet
    2. 任何人都可以指出我正确的方向,所以我可以优雅地为每个关系调用一次updateLocalData函数。

      谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用键值编码并将关系名称作为函数的参数:

NSString *relationshipName = ...; "comments" or "measurements" or "photos"
NSMutableSet *mutableSet = [self mutableSetValueForKey:relationshipName];
[mutableSet addObject:...];
[mutableSet removeObject:...];

mutableSetValueForKey返回一个与托管对象self绑定的特殊“代理对象”。这意味着如果您修改此集(添加或删除某些内容),则可以有效地修改self的关系。