Iphone NSFetchedResultsController-幻影行
只是遇到了一个棘手的NSFetchedResultsController问题 下面的代码在所有情况下都可以正常工作,除了核心数据数据库报告2行时的第一个条目Iphone NSFetchedResultsController-幻影行,iphone,xcode,core-data,Iphone,Xcode,Core Data,只是遇到了一个棘手的NSFetchedResultsController问题 下面的代码在所有情况下都可以正常工作,除了核心数据数据库报告2行时的第一个条目 id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; numberOfRows = [sectionInfo numberOfObjects]; 我可以看到有1个插入
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];
我可以看到有1个插入和2个选择
此外,如果我已经访问了包含NSFetchedResultsController代码的视图(即在执行插入之前),那么这个问题似乎不会发生
==更新1:
不知道此代码演练是否有助于…
1.ViewController A启动进行下载的后台操作
2.完成后,将向AppDelegate发送通知
3.当AppDelegate收到此通知时,它将导入数据(在执行此操作之前进行检查以确保它位于主线程上) 以下是importerDidSave代码的相关位(此技术来源于此): 哪些产出:
... on Main Thread.
Number of NSFetchedResultsController rows BEFORE: 1
Number of NSFetchedResultsController rows AFTER: 3
那个代码是正确的。我会看看您将数据添加到存储的方式。不要依赖直接SQL调试。核心数据对SQL的使用被隐藏在对象背后(它甚至不总是使用SQL),以至于您无法通过查看SQL来判断对象图的状态 最可能的情况是,该部分中有两个对象,但一个在内存中,另一个在持久存储中。在SQL调试中,只有持久化对象是明显的。在图形中可以有数千个对象,在表部分中可以有数千行,但在对象被持久化之前,它们不会显示在SQL中。此外,SQL插入和删除模式不会直接反映对象图的插入和删除 简而言之,SQL调试对于调试核心数据是非常无用的,在绝大多数情况下,您应该忽略它 如果获取的结果控制器在节中报告两个对象,则节中有两个对象。没有更多的信息,我不能说额外的物体是从哪里来的 检查:
您可以通过手动执行FRC自己使用的相同获取并查看返回的内容来确认FRC是否正确。对每个分区键上的返回进行排序,您可以看到分区中显示了多少对象 是的,代码是正确的。但是,问题不是将数据添加到存储中。查看SQLite数据库,我可以看到只有一行(这与提到1个INSERT的SQL调试一致)。出于某种原因,NSFetchedResultsController返回的行数不正确(但仅在上述特殊情况下)。我认为您认为您只是导入了一个对象而不是两个?是的,仅导入了一个对象。后台线程上只创建了一个对象,我使用NSLog语句和(fwiw)SQL调试模式验证了只导入了一个对象。
- (void)importerDidSave:(NSNotification *)saveNotification {
NSLog(@"In importerDidSave...");
if ([NSThread isMainThread]) {
NSLog(@"... on Main Thread.");
NSLog(@"Number of NSFetchedResultsController rows BEFORE: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
NSLog(@"Number of NSFetchedResultsController rows AFTER: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);
... on Main Thread.
Number of NSFetchedResultsController rows BEFORE: 1
Number of NSFetchedResultsController rows AFTER: 3