2016-03-28 5 views
2

私はアプリケーションのドキュメントディレクトリに複数の画像とビデオを保存しています。この方法でSDWebImageを使用して、その画像と動画をコレクションビューで表示しています。ローカルに保存されたイメージをコレクションビューにすばやく読み込むことができません。

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


AlbumImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AlbumImageCell" forIndexPath:indexPath]; 
cell.albumImage.image=nil; 
cell.layer.shouldRasterize = YES; 
cell.layer.rasterizationScale = [UIScreen mainScreen].scale; 
if (cell == nil) { 
    cell = [[[NSBundle mainBundle] loadNibNamed:@"AlbumImageCell" owner:self options:nil] objectAtIndex:0]; 
} 

NSInteger Type=[[[self.arrTbl_Album_Image objectAtIndex:indexPath.row] objectAtIndex:3] intValue]; 
if (Type==1) { 
     cell.imgPlay.hidden=YES; 
     [cell.albumImage setImage:[images objectAtIndex:indexPath.row]]; 
    }else{ 
     cell.imgPlay.hidden=NO; 
     [cell.albumImage setImage:[images objectAtIndex:indexPath.row]]; 
    } 

    return cell; 
} 

ここではサムネイルを生成するためのコードです。

-(void)load_Album_Data{ 
     NSUserDefaults *album_id=[NSUserDefaults standardUserDefaults]; 
     NSInteger Album_id=[album_id integerForKey:@"album_Id"]; 

//From the query. 
NSString *query=[NSString stringWithFormat:@"select * from tbl_Album_Image where album_id='%ld' order by id desc",Album_id]; 


//Get result. 
if (self.arrTbl_Album_Image != nil) { 
    self.arrTbl_Album_Image=nil; 
} 
self.arrTbl_Album_Image=[[NSArray alloc]initWithArray:[self.dbManager loadDataFromDB:query]]; 


dispatch_queue_t myQueue = dispatch_queue_create("MyQueue",NULL); 
dispatch_async(myQueue, ^{ 

for(int i=0;i<self.arrTbl_Album_Image.count;i++) 
{ 
    NSInteger AssetType=[[[self.arrTbl_Album_Image objectAtIndex:i] objectAtIndex:3] intValue]; 
    if (AssetType==1) { 
     //for image 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *inputPath = [[self.arrTbl_Album_Image objectAtIndex:i]objectAtIndex:2 ]; 

    NSString *imageEx=[inputPath pathExtension]; 
    NSString *imageName=[[inputPath lastPathComponent]stringByDeletingPathExtension]; 

    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",imageName,imageEx]]; 

    UIImage *img=[UIImage imageWithContentsOfFile:fullPath]; 
    CGFloat scale = MAX(106/img.size.width, 106/img.size.height); 
    CGFloat width = img.size.width * scale; 
    CGFloat height = img.size.height * scale; 
    CGRect imageRect = CGRectMake((106 - width)/2.0f, 
            (106 - height)/2.0f, 
            width, 
            height); 
    CGSize c=CGSizeMake(106, 106); 
    UIGraphicsBeginImageContextWithOptions(c, NO, 0); 
    [img drawInRect:imageRect]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 


    [images addObject:newImage]; 
    } 
    else{ 
     //for video 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *inputPath = [[self.arrTbl_Album_Image objectAtIndex:i]objectAtIndex:2 ]; 

     NSString *imageEx=[inputPath pathExtension]; 
     NSString *imageName=[[inputPath lastPathComponent]stringByDeletingPathExtension]; 

     NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",imageName,imageEx]]; 

     NSURL *videoURL = [NSURL fileURLWithPath:fullPath]; 
     AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 

     AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
     imageGenerator.appliesPreferredTrackTransform = YES; 
     NSError *err = NULL; 
     CMTime time = CMTimeMake(1, 2); 
     CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:&err]; 
     UIImage *thumbNailImage = [[UIImage alloc] initWithCGImage:imageRef]; 


     CGFloat scale = MAX(106/thumbNailImage.size.width, 106/thumbNailImage.size.height); 
     CGFloat width = thumbNailImage.size.width * scale; 
     CGFloat height = thumbNailImage.size.height * scale; 
     CGRect imageRect = CGRectMake((106 - width)/2.0f, 
             (106 - height)/2.0f, 
             width, 
             height); 
     CGSize c=CGSizeMake(106, 106); 
     UIGraphicsBeginImageContextWithOptions(c, NO, 0); 
     [thumbNailImage drawInRect:imageRect]; 
     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

      [images addObject:newImage]; 

    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
      //Reload the Image view. 
    [self.album_ImageView reloadData]; 
        } 


    }); 

} 
}); 


} 

しかし、問題は私が高速にイメージを読み込むことができませんまた、アプリケーションがクラッシュダウンダウンスクロールアップが速く起こっている。また、生成されていないビデオ画像も対象となります。 この問題を解決して解決策を教えてください。 コレクションビューのセルで画像を高速に読み込みたい。代わりに、この

[cell.albumImage sd_setImageWithURL:imaURL placeholderImage:[UIImage imageNamed:@"placeholder.png"] options:SDWebImageRefreshCached completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      cell.albumImage.image=image; 
     }); 
    }]; 

にイメージチェンジを設定するにはウルのコードの

+0

クラッシュ、メッセージ、スタックトレースの詳細を表示 – Wain

+0

@Wainこの詳細を参照してください1)受信したメモリ警告2)通信エラー: {count = 1、contents = \t "XPCErrorDescription" => {length = 22、contents = "Connection interrupted"} }私はスクロールアップダウンコレクションビューとアプリケーションのクラッシュダウン –

+0

どのようなイメージは、どのような大きさは、どのようなフォーマットは、クラッシュ時にロードしようとしている(おそらく、これもゆっくりと下にスクロールし、次のセルに行く前に完了しますか?) – Wain

答えて

1

それはあなたのフォトライブラリから画像を保存するときに保存する必要がありますように思え速くロードしても、キャッシュに

+0

受信したメモリの警告とアプリケーションのクラッシュが発生しました。 –

+0

アプリが終了するのはなぜですか? –

+0

詳細を参照してください1)受信したメモリ警告2)通信エラー: {数= 1、内容= "XPCErrorDescription" =><文字列:0x19c54ce50> {長さ= 22、内容= "接続中断"}}> 3)ImageIO:CGImageSourceCreateWithDataデータパラメータはnilです。これはすべて、アップダウンのコレクションビューとアプリケーションのクラッシュをスクロールするときに発生します –

0

を保存しますあなたがそれを必要とする場合はフルサイズで、アプリケーションに表示するために使用できるイメージの適切な縮尺のバージョンを保存します。 ALAssetを使用している場合は、おそらくthumbnailとなります。

これを行うと、イメージの読み込みが高速になり、メモリ使用量が最小限に抑えられます。

現在のところ、あまりにも多くの画像データをメモリに読み込もうとしているだけで、時間がかかり、必然的にアプリケーションが不足するとクラッシュします。デバイスカメラで撮影された画像は実際には非常に大きいです...

+0

はい私はこのアプローチを適用し、セルに表示するためのサムネイルを作成します。また、私のためにはうまくいっていますが、イメージサムネイルが生成されているときにはいつか負荷がかかります。コードの編集を参照してください。それが正しい方法であるかどうかを教えてください。特にアルバムに入るたびに画像が読み込まれるので。 –

+0

メインイメージをディスクに保存している場合は、メインイメージの横のディレクトリと同じ名前のサムネイルも保存しますので、いつでもイメージを保存する必要はありません。 – Wain

関連する問題