加载网络图片

原创 2015年07月08日 16:12:44

在项目的过程中,大部分会遇到加载网络图片的情况。想要实现类似QQ,微信加载图片时有个Loading的效果,就自己写了一个类。

使用GCD开个线程下载数据

#import <UIKit/UIKit.h>

#import <netinet/in.h>

#import <SystemConfiguration/SystemConfiguration.h>

@interface LoadNetworkImageview :UIImageView{

   NSMutableData *imageData;

   BOOL  TouchResponseEnabled;

}


-(id)initWithFrame:(CGRect)frame;

/**

 *  加载图片

 *

 *  @param urlStr           图片URl

 *  @param defaultImageName 默认图片

 *  @param cache            是否加载缓存

 */

-(void)loadImage:(NSString *)urlStr defaultName:(NSString*)defaultImageName   useCache:(BOOL)cache;

@end




#import "LoadNetworkImageview.h"

#define Home_tmp   [NSHomeDirectory()stringByAppendingPathComponent:@"tmp"]


@implementation LoadNetworkImageview

-(id)initWithFrame:(CGRect)frame{

   self=[superinitWithFrame:frame];

   if (self) {

        self.userInteractionEnabled=YES;

    }

    return self;

}



/**

 *  加载图片

 *

 *  @param urlStr           图片URl

 *  @param defaultImageName 默认图片

 *  @param cache            是否加载缓存

 */

-(void)loadImage:(NSString *)urlStr defaultName:(NSString*)defaultImageName   useCache:(BOOL)cache{

   if (![self isNotEmptyString:urlStr]){

       return;

    }

    NSLog(@"%@",[urlStrlastPathComponent]);

   BOOL Network = [selfconnectedToNetwork];

   BOOL FileExist=[selfisFileExist:[urlStr lastPathComponent]];    

    //确认加载缓存并且缓存存在或者 缓存存在但是无网络,所以不得不加载缓存

   if ((cache &&  FileExist) || (!Network &&  FileExist) ) {

       NSString* filename=[NSStringstringWithFormat:@"%@/%@",Home_tmp,[urlStrlastPathComponent]];

        [selfsetImage:[UIImageimageWithContentsOfFile:filename]];

    }

   else{

       //有网络

       if (Network) {

            self.backgroundColor=[UIColorcolorWithRed:0.90green:0.90blue:0.90alpha:1];

            [selfsetImage:[UIImageimageNamed:defaultImageName]];

           //loading

            UIActivityIndicatorView*loadingView=[[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

            [loadingViewsetFrame:CGRectMake((self.frame.size.width-loadingView.frame.size.width)/2, (self.frame.size.height-loadingView.frame.size.height)/2, loadingView.frame.size.width, loadingView.frame.size.height)];

            [loadingViewstartAnimating];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

               //获取图片数据

               NSData *data = [[NSDataalloc] initWithContentsOfURL:[NSURLURLWithString:urlStr]];

               UIImage* _image = [[UIImagealloc] initWithData:data];                

               //将图片写入文件

               NSString* filename=[NSStringstringWithFormat:@"%@/%@",Home_tmp,[urlStrlastPathComponent]];

                [datawriteToFile:filename atomically:YES];

                dispatch_async(dispatch_get_main_queue(), ^{

                   if (_image) {

                        self.image = _image;

                        [loadingViewstopAnimating];

                        [loadingViewremoveFromSuperview];

                    }

                });

            });

        }

       else{

            [selfsetImage:[UIImageimageNamed:defaultImageName]];

        }

    }

    

}



/**

 *  判断网络是否连接

 *

 *  @return BOOL  Yes连接  NO不连接

 */

- (BOOL) connectedToNetwork{

   struct sockaddr_in zeroAddress;

   bzero(&zeroAddress, sizeof(zeroAddress));

    zeroAddress.sin_len =sizeof(zeroAddress);

    zeroAddress.sin_family =AF_INET;

   SCNetworkReachabilityRef defaultRouteReachability =SCNetworkReachabilityCreateWithAddress(NULL, (structsockaddr *)&zeroAddress);

    SCNetworkReachabilityFlags flags;

   BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

   CFRelease(defaultRouteReachability);

   if (!didRetrieveFlags){

        printf("Error. Could not recover network reachability flagsn");

       return NO;

    }

    

   BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);

   BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    

   return (isReachable && !needsConnection) ? YES : NO;

}


/**

 *  判断文件是否存在

 *

 *  @param fileName 文件名

 *

 *  @return BOOL  Yes存在  NO不存在

 */

-(BOOL) isFileExist:(NSString *)fileName

{

   NSString *filePath = [NSStringstringWithFormat:@"%@/%@",Home_tmp,fileName];

    NSFileManager *fileManager = [NSFileManagerdefaultManager];

   BOOL result = [fileManager fileExistsAtPath:filePath];

   return result;

}


/**

 *  判断是否为非空String

 *

 *  @param string 字符串

 *

 *  @return BOOL  Yes非空String   NOString

 */

-(BOOL) isNotEmptyString:(NSString *)string {

   if (string == nil || string ==NULL) {

       return NO;

    }

   if ([string isKindOfClass:[NSNullclass]]) {

       return NO;

    }

    if ([[stringstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]] length]==0) {

       return NO;

    }

    return YES;

}


@end





iOS开发学习笔记之swift3.0几种加载网络图片的方法

swift3.0加载网络图片
  • u014636932
  • u014636932
  • 2017年07月10日 13:41
  • 2243

Picasso网络图片加载框架的使用

介绍Picasso
  • wj_wan_lzj
  • wj_wan_lzj
  • 2016年06月13日 11:38
  • 2090

Android之网络图片加载的5种基本方式

学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助。 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection、H...
  • DickyQie
  • DickyQie
  • 2017年03月01日 21:13
  • 5956

网络加载图片的三种方法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482165
  • s853562285
  • s853562285
  • 2014年10月13日 19:46
  • 3016

Android之Volley框架加载网络图片的三种方式

1.第一种也是最常用的一种:ImageLoader public void imageLoader(String url,ImageView iv){ //ImageLoader的第一...
  • ygd1994
  • ygd1994
  • 2016年05月08日 23:18
  • 1057

利用LruCache为GridView异步加载大量网络图片完整示例

转载:http://blog.csdn.net/lfdfhl/article/details/18350601 ===========================================...
  • tangxuankai
  • tangxuankai
  • 2014年08月07日 19:03
  • 6046

Android加载网络图片学习过程

一、最简单加载网络图片 从网络上取图片数据,显示在应用中,简单不赘述: [java] view plaincopy       try {  ...
  • zml_2015
  • zml_2015
  • 2015年10月07日 09:18
  • 1707

Unity 加载网络图片

IOS工程师都应该用过SDWebImage或者android工程师应该使用过Glide,fresco,Imageloader等,在Unity里面,我按照同样的原理封装了一个ImageLoader 。 ...
  • qq563129582
  • qq563129582
  • 2016年03月17日 17:22
  • 4837

iOS异步加载网络图片

在iOS中加载网络图片有多种方式: 法1:在主线程中同步加载网络图片 在主线程中加载图片,先将图片的URL存放进NSURL,然后再用这个NSURL初始化NSData,再把UIImage用NSData初...
  • luoshengkim
  • luoshengkim
  • 2016年04月01日 16:54
  • 810

深入剖析Android之ListView从网络异步加载图片

深入剖析Android之ListView从网络异步加载图片 我写这篇博客参考了许多文章,其中要重点感谢的是Android ListView从网络获取图片及文字显示和他的英文版文章Android Cu...
  • benbendeda
  • benbendeda
  • 2015年01月26日 22:24
  • 2142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:加载网络图片
举报原因:
原因补充:

(最多只允许输入30个字)