我正在尝试使用我的应用中从Core Data加载的联系人列表创建一个表格视图。
我正在使用NSFetchedResultsController。
在启动应用程序时,我从地址簿中提取联系人并将其添加到Core Data。这样我就可以独立于地址簿管理联系人了。在创建联系人对象时,我有一个create方法,其中包含以下代码:
contact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];
contact.name = name;
NSString *initial = [name substringToIndex:1];
NSString *capitalisedInitial = [initial capitalizedString];
contact.nameInitial = capitalisedInitial;
这会将联系人的第一个字母保存到联系人对象的属性中。
在我的表视图控制器代码中,我按如下方式设置NSFetchedResultsController
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
NSSortDescriptor *descriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"nameInitial" ascending:YES];
NSSortDescriptor *descriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
request.sortDescriptors = [NSArray arrayWithObjects:descriptor1, descriptor2, nil];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.contactsDatabase.managedObjectContext sectionNameKeyPath:@"nameInitial" cacheName:nil];
我的问题只出现在我第一次运行应用程序时(从设备中删除应用程序后)。当我打开应用程序后直接打开联系人页面时,它会显示一个完全空白的表,并且它不会在任何时候刷新。如果我关闭应用程序(不删除)并重新启动它,表格可以正常工作。
另一个奇怪的是,在上面的代码的最后一行中,如果我删除@“nameInitial”并使用nil代替sectionNameKeyPath,一切正常,没有毛刺。但是我真的想要这些部分,因为用户需要添加快捷方式的字母列。
我想这与数据库没有准备好或桌面首次加载时有什么关系,但我认为这些获取的结果控制器应该监听数据库的更新并在它准备好时相应地更新?
任何想法真的很感激......
编辑:
进一步的信息:
首次加载时,numberOfSectionsInTableView委托方法返回0.这似乎是导致问题的原因。在后续加载时,它返回正确的数字。我已经记录了获取的结果控制器,每次都会获取一整套结果......
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSLog([NSString stringWithFormat:@"Number of Sections = %i", [[self.fetchedResultsController sections] count]]);
return [[self.fetchedResultsController sections] count];
}
答案 0 :(得分:0)
你responding to changes正确吗?从文档......
在控制器的托管对象上下文收到processPendingChanges消息之后才会反映更改。因此,如果更改托管对象的属性值以使其在获取结果控制器的结果集中的位置发生更改,则控制器报告的索引通常不会更改,直到当前事件周期结束时(调用processPendingChanges时) )。
听起来好像在您初次导入后,您的上下文没有处理它的更改,因此没有通知您的FRC