我正在尝试从网址插入和映像到UIImageView。我使用以下代码来执行此操作。 运行程序时卡住了
NSURL *url = [NSURL URLWithString:urlstring];
在下面的代码中,它在该特定行上显示“Thread 1:signal SIGABRT”。 有人可以帮助我,并告诉我使用的格式是否正确或我做错了什么?
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"newoffer";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell==nil)
{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSDictionary *temp = [product objectAtIndex:indexPath.row];
UILabel *Label = (UILabel *)[cell viewWithTag:201];
Label.text = [temp objectForKey:@"item_name"];
UIImageView *Image = (UIImageView *)[cell viewWithTag:200];
NSString *urlstring=[temp objectForKey:@"image_url"];
NSURL *url = [NSURL URLWithString:urlstring];
NSData *data = [NSData dataWithContentsOfURL:url];
Image.image = [UIImage imageWithData:data];
return cell;
}
答案 0 :(得分:8)
更改此代码:
NSURL *url = [NSURL URLWithString:urlstring];
NSData *data = [NSData dataWithContentsOfURL:url];
Image.image = [UIImage imageWithData:data];
要:
dispatch_queue_t myqueue = dispatch_queue_create("myqueue", NULL);
// execute a task on that queue asynchronously
dispatch_async(myqueue, ^{
NSURL *url = [NSURL URLWithString:[urlstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];;
NSData *data = [NSData dataWithContentsOfURL:url];
dispatch_async(dispatch_get_main_queue(), ^{
Image.image = [UIImage imageWithData:data]; //UI updates should be done on the main thread
});
});
正如其他人所提到的,像SDWebImage这样的图像缓存库会有很大的帮助,因为即使使用这个实现,你只需将下载过程推送到后台线程,这样UI就不会被卡住,但你不会缓存任何东西。 / p>
答案 1 :(得分:3)
试试这个
[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]];
用于异步下载
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.vbarter.com/images/content/1/9/19517.jpg"]]]];
});
如果网址是动态的,那么
NSString *stringUrl; // this can be any valid url as string
[image setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]]]];
答案 2 :(得分:0)
NSData *data = [NSData dataWithContentsOfURL:url];
将加载imageData同步,这意味着主线程将被阻止。
使用github上的项目:SDWebImage进行图像异步加载和缓存。
答案 3 :(得分:0)
现在可能有更好的库来执行此操作,但我一直在为我的项目使用它,它运行良好:AsyncImageView。还有其他选择,例如SDWebImage
但基本上,你不想使用
NSData *data = [NSData dataWithContentsOfURL:url];
因为在下载图像之前它会阻塞主线程。为了避免这种情况,你可能想要使用异步的东西,比如上面的两个库。
例如,使用AsyncImageView,它变得如此简单:
myImageView.imageURL = someNSURL;