亲爱的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
。
请你告诉我,加载这样的图像最直接的方法是什么?我该怎么改写?
答案 0 :(得分:3)
我建议你使用AsyncImageView,这是iCarousel的Nicklockwood -father的一个很好的实现。
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];
});
});
答案 1 :(得分:2)
如果我想使用自己的自定义代码,我可以告诉你我通常会做什么
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
。
答案 2 :(得分:0)
您的代码没有任何问题(假设您确认它有效)。仅仅因为其他人使用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'条件表达'。结束小尼特。