从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
,但遇到了一些问题。 我明白我的代码是不正确的。 我看到人们使用NSURLRequest
和NSURLConnection
来加载图像并添加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'。 结束小尼特。