使用 NSFetchResultsController 时 UICollectionView 滚动不流畅
Posted
技术标签:
【中文标题】使用 NSFetchResultsController 时 UICollectionView 滚动不流畅【英文标题】:UICollectionView scrolling not smooth when using NSFetchResultsController 【发布时间】:2014-05-09 05:05:26 【问题描述】:我正在使用 UICollectionView 和 NSFetchResultsController 来呈现不同的照片集。这是我第一次同时使用 UICollectionView 和 NSFetchResultsController。
这是我的代码:
- (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有三种方式(不使用,动态使用,静态使用,默认是动态使用)