NSFetchedResultsController + UICollectionView - 处理NSFetchedResultsChangeUpdate

时间:2014-07-13 09:34:43

标签: objective-c core-data uicollectionview nsfetchedresultscontroller

我试图在集合视图中显示CoreData中的数据。我尝试了AshFurrow's code和其他变体,以反映NSFetchedResultsController观察到的数据对集合视图的更改。它似乎有效。

问题是我在后台处理相当繁重的数据,包括添加新项目,添加部分,删除部分甚至合并部分。这会导致UI的显着延迟,滚动。我注意到大部分时间花在更新已更改的集合视图项上:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{

    [self.collectionView performBatchUpdates:^{    

        ....

        case NSFetchedResultsChangeUpdate:
            [self.collectionView reloadItemsAtIndexPaths:@[indexPath]];
        break;

        ....
    }];
}

此代码似乎重新加载甚至无法显示的项目。所以我把它改成了:

case NSFetchedResultsChangeUpdate:
    if ([[self.collectionView indexPathsForVisibleItems] containsObject:indexPath])
        [self.collectionView reloadItemsAtIndexPaths:@[indexPath]];
    break;

这个工作得更快,结果看起来很好。

问题:

  1. 这是正确的解决方案吗?我有什么打破吗?
  2. 有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以通过在中执行重新加载来限制对相关索引路径的更新 controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
而不是controllerDidChangeContent: