关闭

加载网络图片

121人阅读 评论(0) 收藏 举报

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





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:409次
    • 积分:25
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章存档