出现在核心数据关系中的不需要的对象

很长的问题—提前感谢您的时间。 保存新的托pipe对象后,我发现他们添加到我的核心数据库中的另一个对象的关系—一个为我的代码调用没有setter方法,并没有反比关系。 我对代码进行了仔细研究,并使用日志来尽可能地隔离发生的事情,但是我遇到了无法解释(或修复)的奇怪行为。

进一步来说:

我有一个名为PendingSyncTracker的实体。 它只是有一个关系, objectsToSync 。 我还没有在我的代码中添加任何行来调用这个关系的setter方法。 这是一个多对多的关系。 它指向BaseEntity 。 对于“反向”选项,我select了“没有反向关系”。

当我加载一个特定的表视图时,3个对象从服务器下载,然后parsing成pipe理对象并保存。 在表视图开始加载单元格时,这三个对象中的2个将会objectsToSync地出现在objectsToSync关系中。

我已经遍及我的代码使用NSLog来确定什么时候这些对象可以首先被发现作为objectsToSync设置的成员。

 NSSet *objectsToSync = [[[SyncEngine sharedEngine] fetchClassNamed:@"PendingSyncTracker" withPredicates:nil][0] valueForKey:@"objectsPendingSync"]; NSLog(@"PendingSyncTracker objectsToSync set (%lu objects): %@", (unsigned long)[objectsToSync count], objectsToSync); 

当他们第一次出现在集合中的答案实际上取决于我做/不把这两行代码!

  • 在保存我的3个新的核心数据对象的过程中,在保存托pipe对象上下文之前,关系中始终找不到这些对象。

  • 如果我不使用这两行,直到我回到表格视图控制器,将新对象发送到同步引擎以存储在本地(MOC被访问和保存的地方),那么日志会显示2个对象已经被添加到关系中。

  • 如果在同步引擎中保存MOC后立即使用这两行,则日志将会指出(在TVC中存在和返回)只有1个对象已经添加到关系中。

  • 如果在保存MOC之前和之后立即使用这两行,那么所有3个日志都将显示这个关系包含一个空集。

  • 我也有这两行在cellForRowAtIndexPath开头。 无论先前的日志如何,该日志将始终指示2个对象已添加到关系中。

在Sync Engine中创build的所有3个托pipe对象都存储为实体types,这些实体types是BaseEntityobjectsToSync关系指向的对象)的子objectsToSync 。 被添加到关系中的两个types每个都被定义为具有相互关系,但是具有不同的对象,而不是PendingSyncTracker (尽pipe不同的对象是BaseEntity的子实体!)。

那么,这些观察结果是什么呢? 这些对象如何被添加到关系?

更新:

 - (NSArray*) fetchClassNamed:(NSString*)className withPredicates:(id)parameters; { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:className inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; // set predicates if (!(parameters == nil)) { [fetchRequest setPredicate:parameters]; } NSError *error; NSArray *fetchedResults = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; return fetchedResults; } 

首先, [[[SyncEngine sharedEngine] fetchClassNamed...做什么? 只是一个猜测,但它正在与KVC做一些事情来为你设定关系。

此外,你总是总是有反比的关系。 即使你从来没有使用它,核心数据呢。 没有反转会导致很多问题,包括但不限于性能问题和潜在的数据损坏。

添加一个相反的关系,并用什么-fetchClassNamed...更新你的问题。