使用 dispatch_async 在 UICollectionView 中加载图像
Using dispatch_async to load images in UICollectionView
我正在使用 Parse 来存储图像。我正在尝试异步加载图像,因此它不会干扰 collectionView
滚动。我刚开始使用 dispatch_async
,不太确定如何正确实施它。我也研究过延迟加载,但我认为这会起作用。但事实并非如此,collectionView
滚动条断断续续。谢谢
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
albumImageCell *cell = (albumImageCell *) [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[albumImageCell alloc]init];
}
PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
PFFile *file = [temp objectForKey:@"image"];
if (cell.hasImage == FALSE) {
dispatch_async(imageQueue, ^{
NSData *data = [file getData];
if (data) {
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = [UIImage imageWithData:data];
cell.hasImage = TRUE;
});
}
});
}
return cell;
}
因为UIImage +imageWithData
方法有点阻塞主线程。
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = [UIImage imageWithData:data];
所以这些行应该如下所示。
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = image;
此外,在实际显示或渲染 UIImage 对象之前,UIImage 不会立即解码图像。参见 。因此,下面的代码是摆脱不连贯滚动的最佳方法之一。
UIImage *image = [UIImage imageWithData:data];
UIGraphicsBeginImageContext(CGSizeMake(1,1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), [image CGImage]);
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = image;
我正在使用 Parse 来存储图像。我正在尝试异步加载图像,因此它不会干扰 collectionView
滚动。我刚开始使用 dispatch_async
,不太确定如何正确实施它。我也研究过延迟加载,但我认为这会起作用。但事实并非如此,collectionView
滚动条断断续续。谢谢
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
albumImageCell *cell = (albumImageCell *) [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[albumImageCell alloc]init];
}
PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
PFFile *file = [temp objectForKey:@"image"];
if (cell.hasImage == FALSE) {
dispatch_async(imageQueue, ^{
NSData *data = [file getData];
if (data) {
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = [UIImage imageWithData:data];
cell.hasImage = TRUE;
});
}
});
}
return cell;
}
因为UIImage +imageWithData
方法有点阻塞主线程。
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = [UIImage imageWithData:data];
所以这些行应该如下所示。
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = image;
此外,在实际显示或渲染 UIImage 对象之前,UIImage 不会立即解码图像。参见 。因此,下面的代码是摆脱不连贯滚动的最佳方法之一。
UIImage *image = [UIImage imageWithData:data];
UIGraphicsBeginImageContext(CGSizeMake(1,1));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), [image CGImage]);
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^(void){
cell.imageView.image = image;