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