为什么我的NSFetchedResultsControllerDelegate方法在与我的实体创建关系时被随机调用?

问题描述:

我在调试NSFetchedResultsControllerDelegate行为时遇到问题。为什么我的NSFetchedResultsControllerDelegate方法在与我的实体创建关系时被随机调用?

我的NSFetchedResultsController有一个关于Object1实体的获取请求。无论何时触摸一个单元格,我都会创建(并保存)一个与Object2实体的新关系(或者在已经存在的情况下使用)。

我的问题是controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:在创建这样的关系时会随机调用(意思是说,有时它会被调用,有时不会)。

我的代码创建的关系用MagicalRecord

+ (void)createOrUpdateRelationship:(NSDictionary *)userInfo 
          forObject1:(NSManagedObject1 *)object1 { 
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
     NSManagedObject2 *object2 = [NSManagedObject2 fetchObject2ForObject1WithID:object1.ID 
                         inContext:localContext]; 
     if (!object2) { 
      object2 = [NSManagedObject2 MR_createEntityInContext:localContext]; 
      object2.createdAt = [NSDate date]; 
     } 

     object2.updatedAt = [NSDate date]; 
     // Store attributes from userInfo 

     object2.object1 = [object1 MR_inContext:localContext]; 
    } completion:^(BOOL contextDidSave, NSError *error) { 
     // Celebrate 
    }]; 
} 

任何想法,我可能做错了什么?

+0

你必须有反对关系以及从对象2到对象1不是吗? –

+0

绝对如此。我建立了1-1关系的两种方式。 –

+0

请记住,如果object2已经存在,并且与另一个Object1对象(称为“oldObject1”)相关,则会更新* three *对象:object2,object1 *和* oldObject1(其关系将设置为nil)。这是否解释了随机行为? – pbasdf

肮脏的亨利,

Object1正在和对象2和对象2一对一的关系与Object1反比关系以及:)

所以每当你改变这些对象的其他对象的关系值也将被修改:)因此NSFetchedResultsController被触发:)这很常见:)

你不能跳过这些变化被触发。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
     switch(type) { 
      case NSFetchedResultsChangeUpdate: 
      //you might consider ignoring it but I wont prefer that though :) 
      break; 
     } 
} 
+0

哦,对不起,如果我的问题不明确:我没有问题与被调用的代表。我的问题是,当关系创建时,有时它会被调用,有时却不会。我需要知道为什么。 –

+0

@ dirty-henry:我不用魔法记录工作,你可以确认一下,当你说有时它触发,有时不是你在本地上下文建立的关系被同步到主要上下文吗?或保存到持久性商店? –

+0

绝对如此。本地上下文创建为主要上下文的子节点,并在此子节点/本地上下文和(2)父节点/主节点上进行保存(1)。 –