0

嗨,我正在使用PST Collectionview类似UIcollectionview 的。我想将图像从我的文档目录加载到集合视图。第一次尝试同步方式但它太慢了..所以知道如何将图像异步加载到集合视图。

在我的viewdidload中,我添加了以下代码,因此它将图像下载到我的文档目录

 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];



    });

和内部collectionview cellforitem() 方法

- (PSTCollectionViewCell *)collectionView:(PSTCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {


    cell = nil; 
    cell = (GMMCollectionViewCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"test" forIndexPath:indexPath];
    cell.tag = indexPath.row;
    docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    BOOL isImageLoaded = YES;
     bookImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", docPath, [[Images objectAtIndex:indexPath.row]         lastPathComponent]]];

    if(bookImage == nil)
        isImageLoaded = NO;

    if(!isImageLoaded){
        [[cell grid_image] setImage:[UIImage imageNamed:@"Placeholder.png"]];

    }
    else{
       [[cell grid_image] setImage:bookImage ];

    }

    return cell;
}
4

2 回答 2

1

您需要在主线程上更新 UI。尝试像这样包装代码[[self collectionView] reloadData];

dispatch_async(dispatch_get_main_queue(), ^{
    [[self collectionView] reloadData];
});
于 2013-08-03T14:20:26.713 回答
0

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

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

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

该库甚至将图像存储在缓存中,因此我认为您可以删除所有这些下载代码。

下载 lib 并集成到您的项目后,只需删除所有以前的代码,使用后台下载),并将其放在cellForItemAtIndexPath:您的 collectionview 中:

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

就这一点,就像变魔术一样。该库会将placeHolder图像放入您的imageView中,自动异步下载图像,并再次自动将占位符图像更改为下载的图像。试一下。

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

于 2013-08-03T12:32:37.450 回答