更新数据后,单元格内容不会立即显示

时间:2012-08-21 07:18:54

标签: ios core-data uitableview

我现在正在开发一个电子邮件应用。我使用UITableView显示电子邮件列表。该清单是动态的。例如用户可以拉动刷新列表,也可以加载更多邮件。

我想存储邮件,因此我使用CoreDataFetchedResultsController。我已经实现了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委托方法

1 个答案:

答案 0 :(得分:0)

你试过了吗?

[myTableView reloadData];

下载所有电子邮件后,而不是更新部分中的部分和行?

我假设你的

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section;

返回获取数组中的元素数。

e.g。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section
{
    return myArrayOfEmails.count;
}