【问题标题】:load images using SDWebImage in order按顺序使用 SDWebImage 加载图像
【发布时间】:2013-08-21 06:55:22
【问题描述】:

经过大量阅读和建议,我正在尝试在我的应用程序中实现 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);
         }
     }];
    }
}

我该如何解决这个问题(这是我的 for 循环逻辑中的问题吗?)。此外,我试图在单击按钮时取消所有下载,并且正在使用 [_manager cancelAll] 但似乎不起作用 - 知道为什么吗?

谢谢家人!

添加:

现在的问题是,即使我将 setMaxConcurrentOperationCount 设置为 1,管理器也会先将所有缓存的图像插入到数组中,导致顺序中断。即使使用缓存的图像,也不知道如何保持下载顺序。

【问题讨论】:

  • 我不熟悉这个框架。如果它在幕后使用 NSOperationQueue,您可以将其设置为 maxOperations = 1 吗?这样它就不会运行一堆并行操作,而是按照您将它们放入队列的顺序执行它们。
  • [_manager downloadWithUrl...] 返回一个操作,我想我可以将它添加到我自己的 operationQ 中,但是当我尝试这样做时它会崩溃,所以我现在有点避免它.. .

标签: ios objective-c sdwebimage


【解决方案1】:

就像冰一样简单,正如“贾斯汀·安伯森”所指出的那样:

Go to SDWebImageDownloader.m

我假设您使用的是最新的 SDWebImage 库。

第 72 行:

_downloadQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;

改成:

_downloadQueue.maxConcurrentOperationCount = 1;

一次下载一张图片。

干杯

【讨论】:

  • 谢谢雷诺!另外,我只需要调用 [_manager cancelAll] 来取消所有这些请求的图像加载吗?
  • 确实是的:[[SDWebImageManager sharedManager] cancelAll] :)
  • 看起来是一个向外界公开该属性的机会。
  • 还是有问题。下载管理器将在它需要下载的图像之前加载缓存的图像并将它们插入到数组中......再次搞乱那里的顺序!
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
相关资源
最近更新 更多