长问题---提前感谢您的时间。保存新的托管对象后,我发现它们已添加到我的核心数据数据库中另一个对象的关系中——我的代码没有为此调用 setter 方法并且没有反向关系。我仔细研究了代码并使用日志尽可能地隔离事件,但我遇到了我无法解释(或修复)的奇怪行为。
进一步来说:
我有一个名为PendingSyncTracker
. 它只有一种关系,objectsToSync
。我还没有在我的代码中添加任何行来调用这个关系的 setter 方法。这是一对多的关系。它指向BaseEntity
。对于“反向”选项,我选择了“无反向关系”。
当我加载特定的表视图时,会从服务器下载 3 个对象,然后将其解析为托管对象并保存。当表格视图开始加载单元格时,这 3 个对象中的 2 个将神秘地出现在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);
它们何时首次出现在集合中的答案实际上取决于我在哪里放置/不放置这 2 行代码!
在保存我的 3 个新核心数据对象的过程中保存托管对象上下文之前,永远不会在关系上找到对象。
如果我在返回表视图控制器之前不使用这两条线,该控制器将新对象发送到同步引擎以在本地存储(访问和保存 MOC 的位置),那么日志将在那里显示2 个对象已添加到关系中。
如果我在将 MOC 保存在同步引擎中后立即使用这 2 行,那么日志将指示(在 TVC 中和在 TVC 中)仅将 1 个对象添加到关系中。
如果我在保存 MOC 之前和之后(并返回 TVC)立即使用这 2 行,那么所有 3 条日志都将显示该关系包含一个空集。
我在开头也有这两行
cellForRowAtIndexPath
。无论之前的日志如何,该日志将始终指示已将 2 个对象添加到关系中。
在同步引擎中创建的所有 3 个托管对象都存储为实体类型,这些实体类型是BaseEntity
(objectsToSync
关系指向的)的子实体。添加到关系中的 2 种类型均被定义为具有互惠关系,但具有不同的对象,而不是PendingSyncTracker
(尽管不同的对象是 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;
}