加载网络图片

在项目的过程中,大部分会遇到加载网络图片的情况。想要实现类似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





阅读更多
想对作者说点什么? 我来说一句

Glide框架时序图-加载网络图片

2017年12月21日 235KB 下载

ImageLoader加载网络图片

2016年04月25日 1.53MB 下载

LazyList.rar

2016年04月10日 69KB 下载

volley 和imageloader 加载网络图片

2015年12月19日 8.88MB 下载

xUtils加载网络图片

2015年04月10日 1.91MB 下载

没有更多推荐了,返回首页

不良信息举报

加载网络图片

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭