使用 NSFetchResultsController 时 UICollectionView 滚动不流畅

Posted

技术标签:

【中文标题】使用 NSFetchResultsController 时 UICollectionView 滚动不流畅【英文标题】:UICollectionView scrolling not smooth when using NSFetchResultsController 【发布时间】:2014-05-09 05:05:26 【问题描述】:

我正在使用 UICollectionViewNSFetchResultsController 来呈现不同的照片集。这是我第一次同时使用 UICollectionViewNSFetchResultsController

这是我的代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"CellIdentifier";
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    MyPhoto *myPhoto = [self.fetchedResultsController objectAtIndexPath:indexPath];

    cell.imageView.image = [UIImage imageWithData:myPhoto.photoData];

    return cell;



- (NSFetchedResultsController *)fetchedResultsController

    if (_fetchedResultsController != nil)
    
         return _fetchedResultsController;
    

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

        NSManagedObjectContext *moc = [[CoreDataManager sharedInstance] managedObjectContext];

        // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyPhoto" inManagedObjectContext:moc];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:40];

    // Sort using the timeStamp property.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sectionName" ascending:YES];
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES];
    [fetchRequest setSortDescriptors:@[sortDescriptor, sortDescriptor1]];

        // Use the folderName property to group into sections.
         _fetchedResultsController = [[NSFetchedResultsController alloc]  initWithFetchRequest:fetchRequest managedObjectContext:moc sectionNameKeyPath:@"sectionName" cacheName:@"Root"];
        _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
    

当我有更多部分并尝试滚动视图时,它滚动不顺畅。 我错过了什么吗?

【问题讨论】:

为什么您认为是 FRC 导致了问题?你用过时间探查器吗? 是的,我使用了时间分析器,如果我深入到 CallTree-> MainThread 等等,但没有得到任何帮助....从我的代码中没有找到任何正在使用的方法更多内存....它显示更多运行时间 -> dispatch_worker_thread2 您是否反转了调用树并检查了仅显示 Objective-C? 试试这个,打开模拟器并做 Debug->Color Blended Layers。细胞是红色还是绿色?如果它们是红色的,则表示 alpha 层有问题。 单元格显示为绿色,但标题-> 标题显示为红色 【参考方案1】:

NSFetchedResultController 与 TableView 或 CollectionView 一起使用没有区别。

我在你的代码中看到了一些东西 - 1) BatchSize:40 - 批量越大,获取所需的时间就越多。它不会那么频繁地获取,但需要更多时间。例如,尝试将其设置为 20。滚动应该是窒息的。

2) 你的实体是照片。 - 确保不要将 BLOB(大数据)存储为值。它会使获取速度变慢。如果您需要在 CoreData 集中存储图像(存储在外部存储文件中),请在模型中键入。 - 制作图像的缩略图。如果您需要显示小尺寸图像,请制作缩略图并将其直接保存到 CoreData(不要使用“存储在外部存储文件中”)键。这个 vill 使获取速度非常快,因为您不会使用任何外部文件并且照片填充的大小很小。 - 预取数据。如果您有一些子实体(如果照片)并且您正在使用它们,

NSString *relationshipKeyPath = @"bObjects"; // Set this to the name of the relationship on photo
NSArray *keyPaths = [NSArray arrayWithObject:relationshipKeyPath];
[request setRelationshipKeyPathsForPrefetching:keyPaths];

【讨论】:

谢谢,我尝试了你提到的一些方法,现在应用看起来好多了。 不客气!尝试尝试和注释并删除一些代码,这样你就会看到问题出在哪里

以上是关于使用 NSFetchResultsController 时 UICollectionView 滚动不流畅的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)