0

私はSDWebImageを使用して画像を配列にロードしています。これらの画像を for ループで呼び出す順序で読み込む必要がありますが、キャッシュされている画像がいくつかあるため、ダウンロードされる画像の前に配置されます。

2013-08-20 17:45:51.318 img of index 0. Inserted at 0 / 1 with cacheType of 1
2013-08-20 17:45:51.336 img of index 1. Inserted at 1 / 2 with cacheType of 1
2013-08-20 17:45:51.350 img of index 2. Inserted at 2 / 3 with cacheType of 1
2013-08-20 17:45:51.391 img of index 4. Inserted at 3 / 4 with cacheType of 1
2013-08-20 17:45:51.402 img of index 6. Inserted at 4 / 5 with cacheType of 1
2013-08-20 17:45:51.415 img of index 7. Inserted at 5 / 6 with cacheType of 1
2013-08-20 17:45:51.419 img of index 8. Inserted at 6 / 7 with cacheType of 1
2013-08-20 17:45:51.428 img of index 9. Inserted at 7 / 8 with cacheType of 1
2013-08-20 17:45:54.982 img of index 3. Inserted at 8 / 9 with cacheType of 0
2013-08-20 17:45:56.840 img of index 5. Inserted at 9 / 10 with cacheType of 0

キャッシュの種類:

/**
 * The image wasn't available the SDWebImage caches, but was downloaded from the web.
 */
SDImageCacheTypeNone = 0,
/**
 * The image was obtained from the disk cache.
 */
SDImageCacheTypeDisk,
/**
 * The image was obtained from the memory cache.
 */
SDImageCacheTypeMemory 

私の方法:

//Web loading
_manager = [SDWebImageManager sharedManager];
_manager.imageDownloader.maxConcurrentDownloads = 1;

-(void)loadImages:(NSMutableArray*)imagesURLS{
    //_indexOfLastImageLoaded = 0;
    [_loadedImages removeAllObjects];
    _loadedImages = [[NSMutableArray alloc]init];;

    for (int i=0;i<imagesURLS.count;i++){
    [_manager downloadWithURL:[imagesURLS objectAtIndex:i]
                     options:0
                    progress:^(NSUInteger receivedSize, long long expectedSize)
     {
         //NSLog(@"%i out of %lli",receivedSize,expectedSize);
     }
                   completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType,BOOL finished)
     {
         if (image && finished)
         {
                          [_loadedImages addObject:image];
             NSLog(@"img of index %i. Inserted at %i / %i with cacheType of %i",i,[_loadedImages indexOfObject:image],_loadedImages.count, cacheType);

         }
     }];
    }
}

次のような場合に、配列の数をチェックします。

 if(_loadedImages.count > _indexOfImageBeingDisplayed ){
                NSLog(@"Top IV img loaded from array at index %i",_indexOfImageBeingDisplayed);
                [_imagePreviewerTop setImage:[_loadedImages objectAtIndex:_indexOfImageBeingDisplayed]];
                [_imagePreviewerTop setFrame:_borderFrame];
            }

画像の並べ替えにより、ユーザーに表示しようとしている情報が台無しになります。「オプション」パラメータも変更しようとしましたが、それもうまくいきませんでした。

どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

1

replaceObjectAtIndex:WithObjectの代わりに使用することを考えるかもしれませんaddObject

...
if (image && finished) {
    [_loadedImages replaceObjectAtIndex:i withObject:image];
}
...

そのためには、配列をプレースホルダー値で初期化する必要があります。

_loadedImages = [NSMutableArray arrayWithCapacity:imagesURLS.count];
for (NSUInteger i = 0; i < imagesURLS.count; i++) {
    [_loadedImages addObject:[NSNull null];
}
于 2013-08-21T01:07:46.883 に答える