从networking加载UIImage最常用的方法

亲爱的stackoverflowers,

我迷路了。

在我的应用程序中,我从网上加载2个图像,如下所示:

-(void)loadImages { ... image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]]; image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]]; } 

为了不阻塞主线程,我使用GCD

 dispatch_async( dispatch_get_global_queue(0,0), ^{ [self loadImages]; 

之后,我在我的UITableView使用这些图像:

 if (indexPath.row == 0) { cell.imageView.image = image1; } else { cell.imageView.image = image2; } 

然后我决定添加UIActivityIndicator ,但遇到了一些问题。 我明白我的代码是不正确的。 我看到人们使用NSURLRequestNSURLConnection来加载图像并添加UIActivityIndicator

请告诉我,加载这样的图像最正规的方式是什么? 我应该重写什么?

我build议你使用AsyncImageView漂亮的实现由Nicklockwood -father of iCarousel。

https://github.com/nicklockwood/AsyncImageView

使用起来非常简单。

  #import "AsyncImageView.h" 

并在所有imageViews这样做。

  [imageView setImage:@"default.png"]; [imageView setImageURL:@"whateverurl/whateverimage.png"]; 

在你的情况下,它会是:[cell.imageView setImageURL:@“yourURL”];

它像一个魅力,我的代码正在生产。 但是,如果你仍然想要你的代码工作,试试这个:

  UIActivityIndicator *activity =[[UIActivityIndicator alloc] initWithStyle:UIActivityIndicatorWhite]; [activity setFrame:CGRectMake(100,100,30,30)]; [self.view addSubview:activity]; dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); dispatch_async(dispatchQueue, ^(void) { [activity startAnimating]; [self loadImages]; dispatch_sync(dispatch_get_main_queue(), ^{ [yourTableView reloadData]; [activity stopAnimating]; [activty setHidden:YES]; }); }); 

我可以告诉你,如果我想使用我自己的自定义代码,我通常会做什么

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSData * imageData = [NSData dataWithContentsOfURL:_pictureURL]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = [UIImage imageWithData:imageData]; }); }); 

否则,您可以考虑添加该方法的UIImageView+AFNetworking类别

 setImageWithURLRequest:placeholderImage:success:failure: 

UIImageView

你的代码没有问题(假设你已经证实了它的工作原理)。 只是因为别人使用NSURLConnection和相关不会使你错了。

要使用活动指标,请执行以下操作:

 -(void)loadImages { UIActivityIndicator *indicator = ... ... [indicator startAnimating]; image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]]; image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]]; [indicator stopAnimating]; } 

小尼特 – 我个人会使用:

  cell.imageView.image = (0 == indexPath.row ? image1 : image2) 

因为没有人似乎赞赏C'有条件expression'。 结束小尼特。