出现在核心数据关系中的不需要的对象
很长的问题—提前感谢您的时间。 保存新的托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是BaseEntity
( objectsToSync
关系指向的对象)的子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...
更新你的问题。