2013-08-20 3 views
0

После многого чтения и рекомендаций я пытаюсь реализовать инфраструктуру SDWebImage в своем приложении. Я могу загружать изображения с сервера, но проблема в том, что, поскольку изображения разных размеров, они не загружаются в том порядке, в котором я их называю (и хотел бы, чтобы они были).загружает изображения с помощью SDWebImage в порядке

Вот основа для справки: https://github.com/rs/SDWebImage

Как вы можете видеть доказательства этого из печати строки:

2013-08-20 11:11:01.785 Project[10785:c07] SD LOAD 1 array count = 1 
2013-08-20 11:11:02.668 Project[10785:c07] SD LOAD 0 array count = 2 
2013-08-20 11:11:02.946 Project[10785:c07] SD LOAD 3 array count = 3 
2013-08-20 11:11:03.306 Project[10785:c07] SD LOAD 2 array count = 4 
2013-08-20 11:11:03.862 Project[10785:c07] SD LOAD 4 array count = 5 
2013-08-20 11:11:04.094 Project[10785:c07] SD LOAD 5 array count = 6 
2013-08-20 11:11:04.793 Project[10785:c07] SD LOAD 6 array count = 7 
2013-08-20 11:11:04.837 Project[10785:c07] SD LOAD 7 array count = 8 
2013-08-20 11:11:05.046 Project[10785:c07] SD LOAD 8 array count = 9 
2013-08-20 11:11:05.428 Project[10785:c07] SD LOAD 9 array count = 10 

Ниже мой метод:

-(void)sdWebLoadImages:(NSMutableArray*)imagesURLS{ 

    [_loadedImages removeAllObjects]; 
    NSMutableArray *tempArray = [[NSMutableArray alloc]init]; 
    _loadedImages = tempArray; 
    for (int i=0;i<imagesURLS.count;i++){ 

    [_manager downloadWithURL:[imagesURLS objectAtIndex:i] 
        options:0 
        progress:^(NSUInteger receivedSize, long long expectedSize) 
    { 
     // progression tracking code 
    } 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType,BOOL finished) 
    { 
     if (image && finished) 
     { 

      [_loadedImages addObject:image]; 
      NSLog(@"SD LOAD %i array count = %i",i,_loadedImages.count); 
     } 
    }]; 
    } 
} 

Как может Я исправляю это (это что-то в моей логике цикла?). Кроме того, я пытаюсь отменить все загрузки, когда нажата кнопка, и я использую [_manager cancelAll], но, похоже, не работает - любая идея почему?

Спасибо, fam!

ДОБАВЛЕНО:

Сейчас вопрос в том, что менеджер вставляет все кэшированные изображения в массив первых, в результате чего порядок будет нарушен, даже после того, как я установил setMaxConcurrentOperationCount 1. Не уверен, как сохранить загрузка в порядок даже с кешированными изображениями.

+2

Я не знаком с этим каркасом. Если вы используете NSOperationQueue за кулисами, можете ли вы установить его так, чтобы maxOperations = 1? Таким образом, он не будет запускать параллельные операции, но будет выполнять их в том порядке, в котором вы помещаете их в очередь. – Justin

+0

[_manager downloadWithUrl ...] возвращает операцию, которую, я думаю, могу добавить в свою собственную операциюQ, но она срабатывает, когда я пытаюсь сделать это, поэтому я просто избегаю этого в это время ... – royherma

ответ

1

Как просто, как лед, и как указано на «Джастин Амберсон»:

Go to SDWebImageDownloader.m 

Я предполагаю, что вы используете последнюю библиотеку SDWebImage.

В строке 72:

_downloadQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; 

Изменить его:

_downloadQueue.maxConcurrentOperationCount = 1; 

Это загрузит одно изображение в то время.

Cheers

+0

Спасибо Reno! Кроме того, все, что мне нужно, это вызов [_manager cancelAll], чтобы отменить загрузку изображения для всех этих запросов? – royherma

+0

Да действительно: [[SDWebImageManager sharedManager] cancelAll] :) –

+0

Похож на возможность разоблачить это свойство снаружи. – Justin

Смежные вопросы