1

私はフォト ギャラリーを開発しています。この目的のために、基本的に iOS6 デバイスで UICollectionView を実装する PSTCollectionView ( https://github.com/steipete/PSTCollectionView ) を使用し、他の iOS ではカスタム ビューを使用することにしました。私のデバイスは iOS6 を実行しています。

MKNetworkKit を使用してサーバーから画像を読み込み、キャッシュされた応答を使用して画像を設定します。

問題は、最小限の速度でスクロールするとすぐに、スクロールが非常に遅くなるということです(画像の設定によると思います)。どうやら、デキューされたセルはほとんどの場合正しい indexPath にないため、画像は毎回再作成されます。イメージ全体をリセットする代わりに、適切なインデックスパスのためにセルをデキューし、メモリ (またはキャッシュ) からリロードする方法はありませんか?

ここにいくつかのコードがあります:

グリッド (つまり、UICollectionView) の割り当て

PSUICollectionViewFlowLayout *layout = [[PSUICollectionViewFlowLayout alloc] init];
_gridView = [[PSUICollectionView alloc] initWithFrame:[self.view bounds] collectionViewLayout:layout];
_gridView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_gridView.delegate = self;
_gridView.dataSource = self;
[_gridView registerClass:[ImageGridCell class] forCellWithReuseIdentifier:CollectionViewCellIdentifier];
[_gridView setAlwaysBounceVertical:YES];

cellForRowAtIndexPath :

ImageGridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CollectionViewCellIdentifier forIndexPath:indexPath];
id photoId = [self.photoIds objectAtIndex:indexPath.row];
[cell setPhotoId:photoId];
return cell;

setPhotoId メソッド:

if (![_photoId isEqualToNumber:photoId])
{
    NSLog(@"set Photo ID %@ for old id %@", photoId, _photoId);
    _photoId = photoId;
    self.image.image = nil;
    __block BOOL imageAlreadySetFromCache = NO;
    self.operation = [[BDRWebService manager] downloadImageWithId:_photoId.stringValue
                                                      isThumbnail:YES
                                                completionHandler:^(UIImage *fetchedImage, NSURL *url, BOOL isInCache) {
                                                    if (isInCache && !imageAlreadySetFromCache)
                                                    {
                                                        self.image.image = fetchedImage;
                                                        NSLog(@"image ready %@ (from cache %d) %@", _photoId, isInCache, NSStringFromCGSize(self.image.image.size));
                                                        imageAlreadySetFromCache = YES;
                                                    }
                                                    else if (!imageAlreadySetFromCache)
                                                    {
                                                        NSLog(@"image ready %@ (from cache %d) %@", _photoId, isInCache, NSStringFromCGSize(self.image.image.size));
                                                        self.image.image = fetchedImage;
                                                    }
                                                } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
                                                }];

}
else
{
    NSLog(@"same cell and image...");
}

ログは次のとおりです。

2012-11-23 11:39:25.431 cellForRow 12
2012-11-23 11:39:25.433 set Photo ID 269 for old id (null)
2012-11-23 11:39:25.436 cellForRow 13
2012-11-23 11:39:25.437 set Photo ID 268 for old id (null)
2012-11-23 11:39:25.440 cellForRow 14
2012-11-23 11:39:25.441 set Photo ID 267 for old id (null)
2012-11-23 11:39:25.463 cellForRow 15
2012-11-23 11:39:25.468 set Photo ID 266 for old id 280
2012-11-23 11:39:25.480 cellForRow 16
2012-11-23 11:39:25.488 set Photo ID 265 for old id 281
2012-11-23 11:39:25.490 cellForRow 17
2012-11-23 11:39:25.504 set Photo ID 264 for old id 279
2012-11-23 11:39:25.511 cellForRow 18
2012-11-23 11:39:25.566 set Photo ID 263 for old id 276
2012-11-23 11:39:25.570 cellForRow 19
2012-11-23 11:39:25.580 set Photo ID 262 for old id 277
2012-11-23 11:39:25.583 cellForRow 20
2012-11-23 11:39:25.591 set Photo ID 261 for old id 278
2012-11-23 11:39:25.654 cellForRow 21
2012-11-23 11:39:25.659 set Photo ID 260 for old id 273
2012-11-23 11:39:25.661 cellForRow 22
2012-11-23 11:39:25.665 set Photo ID 259 for old id 274
2012-11-23 11:39:25.667 cellForRow 23
2012-11-23 11:39:25.671 set Photo ID 258 for old id 275
2012-11-23 11:39:25.690 cellForRow 24
2012-11-23 11:39:25.693 set Photo ID 257 for old id 270
2012-11-23 11:39:25.696 cellForRow 25
2012-11-23 11:39:25.700 set Photo ID 256 for old id 271
2012-11-23 11:39:25.703 cellForRow 26
2012-11-23 11:39:25.707 set Photo ID 255 for old id 272
2012-11-23 11:39:25.733 cellForRow 27
2012-11-23 11:39:25.737 set Photo ID 254 for old id 269
2012-11-23 11:39:25.740 cellForRow 28
2012-11-23 11:39:25.747 set Photo ID 253 for old id 267
2012-11-23 11:39:25.758 cellForRow 29
2012-11-23 11:39:25.776 set Photo ID 252 for old id 268
2012-11-23 11:39:25.872 cellForRow 30
2012-11-23 11:39:25.886 set Photo ID 251 for old id 264
2012-11-23 11:39:25.890 cellForRow 31
2012-11-23 11:39:25.894 set Photo ID 250 for old id 265
2012-11-23 11:39:25.897 cellForRow 32
2012-11-23 11:39:25.906 set Photo ID 249 for old id 266

永遠にこのようになります (おそらく、それは適切な動作です。結局のところ、それがデキューのすべてです?) が、スクロールを速くすることはできますか?

あらゆる種類のヒントを使用できます (0.2 秒後にタイマーを使用して画像を読み込み、prepareForReuse メソッドで無効にし、操作をキャンセルします (試してみましたが、これまでのところ何も改善されていません))。

self.image.image = fetchedImage毎回新しい割り当てを防ぐために、画像をセルに「貼り付ける」にはどうすればよいですか?

4

2 に答える 2

0

の代わりに、などのPSCollectionViewFlowLayout_代わりに使用する必要があります。PSUICollectionViewFlowLayoutPSCollectionViewController_PSUICollectionViewController

これは、コントロールを使用しているためだと思いますPSTCollecitonView。iOS 5.1 PSTCollectionViewのレガシーサポートがそのまま必要であるが、iOS 6では、UICollectionViewネイティブを使用する必要がある場合。この場合、iOS5のPSTCollectionViewである可能性があります。*は遅くなります。しかし、iOS 6.0では、すべてがうまくいくはずです。

公式ドキュメントから:

UICollectionViewを使用したいが、それでも古いバージョンのiOSをサポートする必要がありますか?次に、このプロジェクトを気に入るはずです。もともと私は、テキストの選択と注釈をサポートするiOS PDFフレームワークであるPSPDFKit用に作成しましたが、このプロジェクトは、他の人が自分で保持するにはあまりにも便利なようでした:)

iOS4.3 / 5.xでPSTCollectionViewを、iOS6でUICollectionViewを使用する場合は、PSUICollectionViewを使用します(基本的に、古いiOSバージョンの自動サポートを取得するには任意のUICollectionView *クラスにPSを追加します)PSTCollectionViewを常に使用する場合は、PSTCollectionViewを使用しますクラス名として。(UIをPSTに置き換えます)

于 2013-01-17T16:07:10.280 に答える
0

ブロックは別のスレッドで実行されると思います。したがって、すべての UI 関連の操作はメイン スレッドで実行する必要があります。

dispatch_async(dispatch_get_main_queue(), ^{


      if (isInCache && !imageAlreadySetFromCache)
          {
            self.image.image = fetchedImage;
            NSLog(@"image ready %@ (from cache %d) %@", _photoId, isInCache, NSStringFromCGSize(self.image.image.size));
            imageAlreadySetFromCache = YES;
          }
         else if (!imageAlreadySetFromCache)
         {
           NSLog(@"image ready %@ (from cache %d) %@", _photoId, isInCache, NSStringFromCGSize(self.image.image.size));
           self.image.image = fetchedImage;
         }

});  
于 2012-11-23T11:02:11.170 に答える