我现在正在开发一个电子邮件应用。我使用UITableView显示电子邮件列表。该清单是动态的。例如用户可以拉动刷新列表,也可以加载更多邮件。
我想存储邮件,因此我使用CoreData
和FetchedResultsController
。我已经实现了NSFetchedResultsControllerDelegate
。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller
didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex
forChangeType:(NSFetchedResultsChangeType)type
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:(EmailsTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)sectionIndex
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:sectionIndex];
return [sectionInfo numberOfObjects];
}
现在问题出在我从服务器下载邮件并使用CoreData对象存储它们之后。 tableview首先显示新的空白单元格,然后是实际内容(约3~5秒延迟)。如何在更改模型后立即更新tableview并让单元格内容立即显示?
我正在后台线程中更新托管上下文,这可能会导致此类问题。您应该在主线程中调用FRC委托方法。
答案 0 :(得分:0)
你试过了吗?
[myTableView reloadData];
下载所有电子邮件后,而不是更新部分中的部分和行?
我假设你的
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section;
返回获取数组中的元素数。
e.g。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section
{
return myArrayOfEmails.count;
}