0

我有各种与实体存在一对多关系的核心数据实体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];

理论上,我可以用一个 NSSet 替换来替换这两个,但我仍然需要知道我打算替换三个中的哪一个:

  1. self.batteryComments = replacementEntitySet

谁能指出我正确的方向,这样我就可以优雅地updateLocalData为每个关系调用一次我的函数。

谢谢

4

1 回答 1

1

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

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

mutableSetValueForKey返回绑定到托管对象的特殊“代理对象” self。这意味着如果您修改此集合(添加或删除某些内容),那么您有效地修改了self.

于 2013-04-10T08:57:54.430 回答