异步图像加载不起作用?

时间:2013-08-03 11:14:36

标签: ios objective-c asynchronous uicollectionview pstcollectionview

我喜欢使用类似PST Collectionview的{​​{1}}。我想将文档目录中的图像加载到Collection视图。首先尝试同步方式但速度太慢..所以我知道如何加载图像与collectionview异步。

在我的 viewdidload 中,我添加了以下代码,以便将图片下载到我的文档目录

UIcollectionview

和collectionview中的cellforitem()方法

 dispatch_queue_t imageLoadQueue = dispatch_queue_create("com.aaa.nkp",NULL);

    dispatch_async(imageLoadQueue, ^{

        usleep(1000000);
        docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];


        for(int i=0; i <[Images count] ;i++){


            imgURL = [Images objectAtIndex:i];
            [imagePreview addObject:imgURL];
            imgData=[NSData dataWithContentsOfURL:[NSURL URLWithString:imgURL]];


            [imgData writeToFile:[NSString stringWithFormat:@"%@/%@", docPath, [imgURL lastPathComponent]] atomically:YES];


        }

                   [[self collectionView] reloadData];



    });

2 个答案:

答案 0 :(得分:1)

您需要更新主线程上的UI。尝试在[[self collectionView] reloadData];周围包装代码,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
    [[self collectionView] reloadData];
});

答案 1 :(得分:0)

为什么要将图像下载到目录中?

要异步下载图像,我建议您使用SDWebImage。它是一个很棒的库,可以通过cocoapods轻松安装。

这是项目的页面:https://github.com/rs/SDWebImage

这个lib甚至可以将图像存储在缓存中,所以我认为你可以删除所有这些下载代码。

下载了lib并集成到您的项目后,只需删除所有以前的代码(后台下载),并将其放在您的集合视图的cellForItemAtIndexPath:内:

 // Here we use the new provided setImageWithURL: method to load the web image
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"anyURLhere"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

就这样,就像魔术一样。 lib会将placeHolder图像放入imageView,自动异步下载图像,并再次使用下载的图像自动更改占位符图像。试一试。

如果您想了解更多信息,可以查看项目的github页面。