加载网络图片

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





相关文章推荐

Android异步加载访问网络图片-解析json

来自:http://www.imooc.com/video/7871 推荐大家去学习这个视频,讲解的很不错。 慕课网提供了一个json网址可以用来学习:http://www.imooc.com/a...
  • hnyzwtf
  • hnyzwtf
  • 2016年01月23日 23:05
  • 4454

volley 和imageloader 加载网络图片

  • 2015年12月19日 13:35
  • 8.88MB
  • 下载

解决ListView异步加载网络图片的各种问题(二)

MainActivity如下: package lee.listviewimage; import java.util.ArrayList; import java.util.HashMap; ...
  • lfdfhl
  • lfdfhl
  • 2012年11月24日 15:16
  • 1514

android 子线程URL加载网络图片

  • 2016年01月20日 16:48
  • 1.3MB
  • 下载

Android imageloader加载网络,本地图片方式

imageloader加载图片路径选择 先初始化DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() ...

Html.fromHtml加载网络图片

  • 2017年06月12日 21:02
  • 25.1MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:加载网络图片
举报原因:
原因补充:

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