图像被覆盖

时间:2015-03-25 12:52:38

标签: ios multithreading uiimageview uicollectionview

我正在构建一个我第一次使用线程的项目。

我已经拍摄了一个我想要显示图片的collectionView。我在一个数组中拍摄了10个图像URL。现在,下载后,图像将显示在集合视图中。

但是当我运行我的项目时,图像即将出现,但图像会不断被覆盖。

我对如何在集合视图中显示所有图像感到困惑。

我的代码是

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

     self.arrImages = @[@"http://helpyourselfimages.com/wp-content/uploads/2014/10/Nature-Pictures-HD1.jpg",
                   @"http://helpyourselfimages.com/wp-content/uploads/2014/10/Beautiful-Island-Wallpaper.jpg",
                   @"http://hdwallpapers4u.eu/wallpaper_3840x2160/booty_hose_sofa_thongs_girl_beautiful_nature_ultra_3840x2160_hd-wallpaper-242177.jpg",
                        @"http://www.pageresource.com/wallpapers/wallpaper/chelsea-logo-nature-hd-beauty.jpg",
                   @"http://dowehwall.com/wp-content/uploads/2015/01/hd-wallpaper-beautiful-nature-hd-wallpaper-nature-beautiful-hd-426201-download-this-wallpaper-use-for-facebook-cover-edit-this-wallpapers.jpg",
                   @"http://imgstocks.com/wp-content/uploads/2013/12/Beautiful-nature-cool-images-background-hd-wallpaper-beautiful-nature.jpg",
                   @"http://ghost2-gbj.rhcloud.com/content/images/2013/Dec/beautiful_nature_wallpapers_for_desktop_high_definition_wallpaper.jpg",
                   @"http://www.hdwallpapersos.com/wp-content/uploads/2014/08/nike-air-max-nature-beautiful-pictures.jpg",
                   @"http://www.3dwallhd.com/wp-content/uploads/2013/02/white_tiger_beautiful-wide.jpg",
                   @"http://mobiledady.com/wp-content/uploads/2013/04/Beautiful-HD-Nature-Wallpapers-For-Desktop-2013-2014-9.jpg"];

    [self fetchData];



}

-(void)fetchData{

    dispatch_queue_t imageQueue = dispatch_queue_create("Image Queue",NULL);
    for (NSString *urlString in self.arrImages) {
    dispatch_async(imageQueue, ^{

            NSURL *url = [NSURL URLWithString:urlString];
            NSData *imageData = [NSData dataWithContentsOfURL:url];
            UIImage *image = [UIImage imageWithData:imageData];

            if (!self.imageNature) return;

             dispatch_async(dispatch_get_main_queue(), ^{

                [self.imageNature setImage:image];



            });

        });
    }



}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

    return [self.arrImages count];

}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{


    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionCell" forIndexPath:indexPath];

    self.imageNature = (UIImageView *)[cell.contentView viewWithTag:1];

    return cell;
}

- (IBAction)btnAlrt:(id)sender {

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"BOOM!!" message:@"Main Thread Is Running" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];

    [alert show];


}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}


 @end

1 个答案:

答案 0 :(得分:0)

他们有很多方法可以做到这一点,但我先解释一下你必须以同步的方式下载图像,因为你没有什么可管理的,所以只需下载第一张图片并添加到你的阵列中,为所有人做这件事,你将能够使它发挥作用。

我使用的另一种方法是使用Afneworking,它提供了一种缓存图像的方法,但仍然需要管理一些事情。

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest
              placeholderImage:(UIImage *)placeholderImage
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure;