IOS 加载网络图片的方式对比

 //1. NSData dataWithContentsOfURL
//    [self.icon setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:tempUrl]]];

    //2. dispath形式添加到异步处理
//    [self imageDownLoadByUrlASYNC:tempUrl Complete:^(UIImage *image) {
//        [self.icon setImage:image];
//    }];
    //3. 当前我所选用的方式 边下载边加载的方式 用的CGImageRef imageWithCGImage
    _request = [[NSURLRequest alloc] initWithURL:tempUrl];
    _conn    = [[NSURLConnection alloc] initWithRequest:_request delegate:self];

    _incrementallyImgSource = CGImageSourceCreateIncremental(NULL);

    _recieveData = [[NSMutableData alloc] init];
    _isLoadFinished = false;

    self.icon.alpha = .5;
    self.lblTitle.alpha = .5;
    [self.lblTitle setText:appName];

第一种方式,是基本上很少有人用的 是最基础的方式 这种方式有个问题 就是网络不好的情况下会卡主线程,导致程序假死

第二种方式,请款这段实现代码

//
//-(void)imageDownLoadByUrlASYNC:(NSURL *)url Complete:(complete)finished
//{
//    //异步并列执行
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        UIImage *image = nil;
//        NSError *error;
//        NSData *responseData = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
//        image = [UIImage imageWithData:responseData];
//        //跳回主队列执行
//        dispatch_async(dispatch_get_main_queue(), ^{
//            //在主队列中进行ui操作
//            finished(image);
//        });
//
//    });
//}

虽然情况跟第一种实现一样,但是将执行代码添加到对应的异步执行中 然后再成功下载之后 获取到image之后 放到主线程执行回调 设置image

第三种方式 需要以下代码 这是我百度到的方式

#pragma mark -- NSURLConnectionDataDelegate

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
    _expectedLeght=response.expectedContentLength;
    NSLog(@"expectedLength:%lld",_expectedLeght);

    NSString*mimeType=response.MIMEType;
    NSLog(@"MIMETYPE%@",mimeType);

    NSArray*arr=[mimeType componentsSeparatedByString:@"/"];
    if(arr.count<1||![[arr objectAtIndex:0] isEqual:@"image"])
    {
        NSLog(@"notaimageurl");
        [connection cancel];
        _conn=nil;
    }
}
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
    NSLog(@"Connection%@error,errorinfo:%@",connection,error);
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    NSLog(@"ConnectionLoadingFinished!!!");
    //ifdownloadimagedatanotcomplete,createfinalimage
    if(!_isLoadFinished){
        CGImageSourceUpdateData(_incrementallyImgSource,(CFDataRef)_recieveData,_isLoadFinished);
        CGImageRef imageRef=CGImageSourceCreateImageAtIndex(_incrementallyImgSource,0,NULL);
        UIImage * image=[UIImage imageWithCGImage:imageRef];
        [self.icon setImage:image];
        CGImageRelease(imageRef);
        }
}
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [_recieveData appendData:data];

    _isLoadFinished=false;if(_expectedLeght==_recieveData.length){
        _isLoadFinished=true;
        }

    CGImageSourceUpdateData(_incrementallyImgSource,(CFDataRef)_recieveData,_isLoadFinished);
    CGImageRef imageRef=CGImageSourceCreateImageAtIndex(_incrementallyImgSource,0,NULL);
    UIImage * image=[UIImage imageWithCGImage:imageRef];
    [self.icon setImage:image];
    CGImageRelease(imageRef);
}

这个方法经过我测试了  非常好用 但是不知道会不会有什么bug  只是刚使用 并且用户体验也会相应增加

时间: 2024-11-08 21:46:20

IOS 加载网络图片的方式对比的相关文章

IOS加载网络图片的框架(共有4中方法)

框架名为:UIImage+WebCache.h   继承于UIimageView 框架里面加载网络图片的方法共4中:分别为1.普通加载   2.线程NSThread    3. #import "ViewController.h" #import "UIImage+WebCache.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [su

IOS 加载网络图片2

//1. NSData dataWithContentsOfURL // [self.icon setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:tempUrl]]]; //2. dispath形式添加到异步处理 // [self imageDownLoadByUrlASYNC:tempUrl Complete:^(UIImage *image) { // [self.icon setImage:image]; // }]

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){         var ZYHImage:UIImage?         if url == nil {             return   

用GCD的方式,加载网络图片(主线程加载图片+类扩展方式)

用GCD的方式,加载网络图片(主线程加载图片+类扩展方式) 用两种方法来实现网络加载图片 方法1:实现的效果:先加载背景色灰色,两秒后加载图片 - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor=[UIColor grayColor]; //刷新UI(在主线程中刷新UI!!!) --- 一般方法 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PR

ios开发多线程篇--异步加载网络图片

一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 原因:iOS9.0引入了新特性

iOS 开发之 为UIButton添加类别方法加载网络图片

iOS 开发之 为UIButton添加类别方法加载网络图片 使用GCD线程队列实现 工程如下: UIButton+WebCache.h #import <UIKit/UIKit.h> // 为Button添加类别方法 @interface UIButton (WebCache) - (void)xr_setButtonImageWithUrl:(NSString *)urlStr; @end UIButton+WebCache.m #import "UIButton+WebCache

Android三种基本的加载网络图片方式(转)

Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

iOS 加载Image的两种方式

Apple官方文档对于加载image提供了两个方法 + (nullable UIImage *)imageNamed:(NSString *)name; + (nullable UIImage *)imageWithContentsOfFile:(NSString *)path; 那么这两个方法对于加载图片有什么区别呢,下面我们用序列帧动画来演示这两个方法的区别: 这个程序一共加载了三组序列帧动画: 首先我们使用+ (nullable UIImage *)imageNamed:(NSString

ios UIImageView异步加载网络图片

方法1:在UI线程中同步加载网络图片 UIImageView *headview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; NSURL *photourl = [NSURL URLWithString:@"http://www.exampleforphoto.com/pabb/test32.png"]; //url请求实在UI主线程中进行的 UIImage *images = [UIImage ima