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];
//    }];
    //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-10-23 16:09:59

IOS 加载网络图片2的相关文章

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 加载网络图片的方式对比

//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   

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

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 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

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计 在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求. 先来介绍一下我项目中的图文混排的需求:首先我从服

UIImageView异步加载网络图片

在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下: 去下载https://github.com/rs/SDWebImage放进你的工程里,加入头文件#import "UIImageView+WebCache.h"加载网路图片就一句话[imageView setImageWithURL:url  placeholderImage:[UIImage imageNamed:@"defaultImage.png"]];ima

Afianl框架里面的FinalBitmap加载网络图片

在Afianl框架里,FinalBitmap如何加载网络图片?有什么简单的方法吗?现在让麦子学院的android开发老师讲讲afina框架里面的finalbitmap加载网络图片的方法,Afinal里边FinalBitmap:用于显现bitmap图像,而无需思考线程并发和oom等疑问. 1.测验恳求 运用页面翻开http://avatar.csdn.net/C/6/8/1_bz419927089.jpg"可以看到一张图像. 2.新建FinalBitmap目标 1 FinalBitmap bitm