`
duoerbasilu
  • 浏览: 1482181 次
文章分类
社区版块
存档分类
最新评论

UIImageView异步加载网络图片

 
阅读更多

猴子原创,欢迎转载。转载请注明:转载自Cocos2D开发网--Cocos2Dev.com,谢谢!

原文地址:http://www.cocos2dev.com/?p=261


今天要在UIImageView中显示网络的图片,因为UIImageView自身就可以读取网络图片,所以,最简单的做法是:

- (void)viewDidLoad
{
 [super viewDidLoad];

 self.tv_headPic = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)] autorelease];
self.tv_headPic.layer.masksToBounds = YES;
self.tv_headPic.layer.cornerRadius = 5.0f;
 [self.tv_headPic setBackgroundColor:[UIColor grayColor]];
 [self.view addSubview:self.tv_headPic];

 NSURL *imageUrl = [NSURL URLWithString:HEADIMAGE_URL];
 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
self.tv_headPic.image = image;
}


这是最简单的,但是由于在主线程中加载,会阻塞UI主线程。所以可以试试NSOperationQueue,一个NSOperationQueue操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等。


下面就是使用NSOperationQueue实现子线程加载图片:

- (void)viewDidLoad
{
 [super viewDidLoad];

 operationQueue = [[NSOperationQueue alloc] init];

 self.tv_headPic = [[[UIImageView alloc] initWithFrame:CGRectMake(110, 50, 100, 100)] autorelease];
 self.tv_headPic.layer.masksToBounds = YES;
 self.tv_headPic.layer.cornerRadius = 5.0f;
 [self.tv_headPic setBackgroundColor:[UIColor grayColor]];
 [self.view addSubview:self.tv_headPic];

 NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil];
 [operationQueue addOperation:op];
}

- (void)downloadImage
{
 NSURL *imageUrl = [NSURL URLWithString:HEADIMAGE_URL];
 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
 self.tv_headPic.image = image;
}


不过这也不是最好的设计,因为虽然是异步加载,但是没有缓存图片。重新加载时又要重新从网络读取图片,所以可以考虑保存图片。


1、建立本地缓存目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
 diskCachePath = [[[paths objectAtIndex:0] stringByAppendingPathComponent:@"ImageCache"] retain];

 if (![[NSFileManager defaultManager] fileExistsAtPath:diskCachePath]) {
 NSError *error = nil;
 [[NSFileManager defaultManager] createDirectoryAtPath:diskCachePath
 withIntermediateDirectories:YES
 attributes:nil
 error:&error];
 }


2、保存在本地,接着可以用图片名称或者URL或者hash过后的值作为key(本地文件名),写入到本地,我比较喜欢用MD5一下图片url作为文件名保存。

if (![[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
 [[NSFileManager defaultManager] createFileAtPath:localPath contents:localData attributes:nil];
 }

下载图片前先判断是否已经缓存了,已经缓存了就不要再去下载了。
分享到:
评论

相关推荐

    一行代码实现UIImageView的异步加载、缓存图片。(iOS源码)

    来源: github/WKWebImage ... 安装: pod 'WKWebImage' 并 #import "WKWebImage.h" 异步加载图片 包含以下四种设置方法: // 异步加载图片 - (void)wk_setImageWithURL:(NSURL *)url; // 加载 + 设置placeholder -

    图片异步加载库SDWebImage

    这是一个第三方图片异步加载库SDWebImage,Github地址为:https://github.com/rs/SDWebImage,这个库主要实现了为UIImageView添加一个类别方法,让使用者使用图片异步加载就好像直接为UIImageView设置image一样,...

    SDWebImag图片加载类库

    1.为UIImageView加载网络图片,为Cocoa Touch框架提供缓存管理。 2.异步图片下载 3.异步内存+磁盘图片缓存,自动缓存过期处理。 4.确保同一个url不会被加载很多次 5.确保虚假url不会被重复提交很多次

    UIImageView+WebCache

    可以轻松的处理网络图片加载的问题,进行异步的加载。

    DPImageCache:UIImageView的Swift扩展。 帮助异步加载图像并存储本地文件缓存

    帮助异步加载图像并存储本地文件缓存。 特征 异步加载图像。 缓存基于本地文件。 如何使用 导入DPImageCache.swift 像这样的简单代码: let imgAddress = " http://blabla.com/blabla.png " imgView. ...

    AsyncImage:在 SwiftUI 中从 URL 异步加载图像

    异步图像该项目演示了如何在 SwiftUI 中异步加载图像。 用法: // Image URLs to loadlet posters = [ " https://image.tmdb.org/t/p/original/pThyQovXQrw2m0s9x82twj48Jq4.jpg " , " ...

    SDWebImage.framework

    UIImageView、UIButton异步加载图片,及更多图片文件操作

    SDWebImage远程图片加载

    SDWebImage使用——一个可管理远程图片加载的类库 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。

    iOS-SDWebImage详细介绍

    在iOS的图片加载框架中,...1.提供了一个UIImageView的category用来加载网络图片并且对网络图片的缓存进行管理 2.采用异步方式来下载网络图片 3.采用异步方式,使用内存+磁盘来缓存网络图片,拥有自动的缓存过期处理

    具有缓存支持的异步图像下载器,作为UIImageView类别-Swift开发

    UIImageView,UIButton,MKAnnotationView的功能类别,用于添加Web图像和缓存管理异步图像下载程序,具有自动缓存过期处理功能的异步内存+磁盘图像缓存,背景图像解压缩以避免帧速率下降渐进图像加载(包括动画加载...

    iOS 图片加载框架SDWebImage解读

    在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们就需要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成APP闪退。 SDWebImage 提供...

    SDWebImage

    这是一个第三方图片异步加载库SDWebImage,Github地址为:https://github.com/rs/SDWebImage,这个库主要实现了为UIImageView添加一个类别方法,让使用者使用图片异步加载就好像直接为UIImageView设置image一样,...

    Longinus:一个纯粹的Swift高性能异步图像加载框架。支持SwiftUI

    它是从Objective-C网络图像加载框架和中学到的,为Swift带来了许多高性能的功能。它可能对您来说是一个更好的选择。 Longinus的目标是成为Swift上性能最高的Web图像加载框架。 特征 异步图像下载和缓存。 预加载...

    iOS图片瀑布流

    图片瀑布流显示,向上拖拽加载更多,自定义UIImageView类,可以自定义按需扩充。稍加修改可以实现异步加载。 第一次上传iOS源码,主要还是学习,免积分下载,如有BUG和不妥的地方,请不吝赐教。

    UIImageView-AsyncLoad

    UIImageView-AsyncLoad ======================= UIImageView + AsyncLoad是UIImageView的扩展,用于在iOS上异步加载和显示图像。 开发人员将拥有一个轻松的环境,无需做很多工作即可在imageview上显示远程图像,更...

    sdwebimage库,可直接使用

    这是一个第三方图片异步加载库SDWebImage,Github地址为:https://github.com/rs/SDWebImage,这个库主要实现了为UIImageView添加一个类别方法,让使用者使用图片异步加载就好像直接为UIImageView设置image一样,...

    sdwebImage

    这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。 使用示范的代码:

    SDWebImage_Comment:SDWebImage源码解读下载,缓存,加载等机制详细讲解,附带注释代码-源码下载

    提供UIImageView , UIButton , MKAnnotationView的分类,用于加载网络图片,并进行缓存管理; 初步方式来下载网络图片 异步方式: memory (内存)+ disk (磁盘)来缓存网络图片,自动管理缓存; 后台图片解码,...

    3分钟快捷创建高性能轮播图

    概要:封装轮播图,混合加载网络图片和本地图片,实现UIImageView、UILabel的复用,使用内存缓存,磁盘缓存、多线程和runloop解决UI卡顿,定时器等问题。暂时未发现有任何bug,如果您遇到bug希望你能Issues我。 ...

    ImageLoader:适用于 iOS 的轻量级快速图像加载器

    ImageLoader是用于异步图像加载的工具。 它是适用于 iOS 的轻量级快速图像加载器。 特征 UIImageView 类别的简单方法。 缓存模块可以自行设置。 加载图像由 ImageLoader 处理,而不是 UIImageView。 易于从其他...

Global site tag (gtag.js) - Google Analytics