1

写真を撮ったら、画像ファイルを NSDocuments ディレクトリに作成したフォルダに保存します。(/ドキュメント/写真/....png)

次に、コレクション ビューの写真のフォルダーにあるすべての写真を読み込みます。ファイルが大きいため、Grand Central ディスパッチを使用して、バックグラウンド スレッドで画像を取得することにしました。しかし、UICollectionView を上下にスクロールすると、正しい画像を表示する前に画像がランダムに変化するのがわかります。画像を取得するたびにメインスレッドに設定するだけだと思いますが、これに対処する方法が本当にわかりません。

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

    NSUInteger rowNumber = [indexPath row];

    //NSString *imagePath = [self.photoPathArray objectAtIndex:rowNumber];

    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"Photos"] error:NULL];

    NSString *imagePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/Photos/%@",[directoryContent objectAtIndex:rowNumber]];

    NSLog(@"the image path is %@", imagePath);

        imageCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath];

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

         UIImage *originalImage = [UIImage imageWithContentsOfFile:imagePath];
         UIImage *thumbNail = [self shrinkImage:originalImage withSize:CGSizeMake(200, 200)];


         dispatch_sync(dispatch_get_main_queue(), ^{
             cell.imageView.image = thumbNail;
         });

     });

    return cell;

}
4

1 に答える 1

0

Apple のサンプル アプリ: LazyTableImages を確認してください。コレクションビューにうまく組み込みました。

http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

于 2013-05-16T02:53:14.303 に答える