0

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

我想存储邮件,所以我使用CoreDataand 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 对象一起存储之后。表格视图首先显示新的空白单元格,然后是真实内容(大约 3~5 秒延迟)。如何在模型更改后立即更新 tableview 并让单元格内容立即显示?

更新

我正在后台线程中更新托管上下文,这可能会导致此类问题。您应该在主线程中调用 FRC 委托方法

4

1 回答 1

0

你有没有尝试过:

[myTableView reloadData];

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

我假设你的

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

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

例如

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section
{
    return myArrayOfEmails.count;
}
于 2012-08-21T08:39:11.127 回答