当我使用url将UIImage设置为NSData时,加载需要一段时间。

NSData *imageUrl = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"] ]]; cell.thumbnailImageView.image=[UIImage imageWithData:imageUrl]; 

这就是我如何使用imageUrl将它们加载到UIImage但加载需要一段时间,程序似乎崩溃或进入无限循环。

如何使用url制作UIImage的内容但速度更快?

使用sdwebimage并从此处下载库文件

你遵循的几个步骤

之后在项目中添加sdwebimage

在你的.h文件中

 #import "UIImageView+WebCache.h" 

在.m文件中

cellforRowAtIndexPath调用cellforRowAtIndexPath

 [cell.thumbnailImageView setImageWithURL:[NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 

我建议你使用AsyncImageView,这是iCarousel的Nicklockwood -father的一个很好的实现。

链接它非常简单易用。

  #import "AsyncImageView.h" 

并在所有imageViews中执行此操作。

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

在你的情况下,它将是:

  [cell.thumbnailImageView setImageURL:@"yourURL"]; 

它就像一个魅力,我的代码正在生产中。 但是,如果您仍然希望您的代码能够运行,请尝试以下

  UIActivityIndicator *activity =[[UIActivityIndicator alloc] initWithStyle:UIActivityIndicatorWhite]; [activity setFrame:CGRectMake(0,0,30,30)]; [cell.contentView addSubview:activity]; cell.thumbnailImageView.image=[UIImage imageNamed:@"Default~cell~image.png"]; 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(), ^{ NSData *imageUrl = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"] ]]; cell.thumbnailImageView.image=[UIImage imageWithData:imageUrl]; [activity stopAnimating]; [activty setHidden:YES]; }); }); 

发生这种情况是因为每当您的手机离开屏幕时,您的图像就会被释放,如果您将其向后滚动到屏幕上,则必须再次下载图像。 只需在下载时缓存您的图像,并检查是否存在使用它,如果不从互联网下载。 您可以使用第三方库,如SDWebImage GitHub链接

导入SDWebImageView+WebCache.h并在您的cellForRowAtIndexPath使用以下内容

 [cell.thumbnailImageView setImageWithURL:[NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"] placeholder:[UIImage imageNamed:@"placeholder.png"]]; 

使用NSOperationQueue,以便您可以在后台线程上执行数据加载。 之后,您应该在主队列上设置图像。

 // Assume queue is created [queue addOperationWithBlock:^{ NSData *imageUrl = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"] ]]; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ cell.thumbnailImageView.image=[UIImage imageWithData:imageUrl]; }]; }]; 

有关NSOperationQueue的更多信息,请参阅有关NSOperationQueue的文档 。

所以尝试加载图像异步。

https://github.com/nicklockwood/AsyncImageView

使用gcd填充图像,

 NSURL *imageUrl = [NSURL URLWithString:[[self.content objectAtIndex:indexPath.row] valueForKey:@"imageUrl"] ]]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ UIImage *image = nil; image = [UIImage imageWithData: [NSData dataWithContentsOfUrl: imageUrl]]; dispatch_sync(dispatch_get_main_queue(), ^{ cell.thumbnailImageView.image = image; }); }) 

您可能希望将图像存储到某个模型对象,也可以跟踪是否已启动下载,因为您不希望将同一图像URL的请求排队。