用GCD的方式,加载网络图片(主线程加载图片+类扩展方式)
用两种方法来实现网络加载图片
方法1:实现的效果:先加载背景色灰色,两秒后加载图片
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor grayColor];
//刷新UI(在主线程中刷新UI!!!) --- 一般方法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString * path=@"http://www.sinaimg.cn/dy/slidenews/4_img/2015_12/704_1579347_398766.jpg";
NSData * data=[NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
UIImage * image=[UIImage imageWithData:data];
NSLog(@"%@",[NSThread currentThread]);
//返回主线程
dispatch_sync(dispatch_get_main_queue(), ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"%@",[NSThread currentThread]); //测试代码---看看该处是否回到主线程
self.imageView.image=image; //为image赋值
});
});
}
方法2:类扩展(封装类)
#import "UIImageView+loadImage.h"
@implementation UIImageView (loadImage)
- (void) loadImageWithPath:(NSString *)path defaultImage:(NSString *) dafaultPath
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//在block内部不能直接给外部的变量赋值,需要转一下类型
__block NSString * str = path;
if (path==nil)
{
str=dafaultPath;
}
else
{
NSData * data=[NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
UIImage * image=[UIImage imageWithData:data];
[NSThread sleepForTimeInterval:2];
//返回主线程
dispatch_sync(dispatch_get_main_queue(), ^{
self.image=image;
});
}
});
}
@end
在viewController.m文件中导入#import "UIImageView+loadImage.h" 然后调用类扩展方法
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor grayColor];
NSString * path=@"http://www.sinaimg.cn/dy/slidenews/4_img/2015_12/704_1579347_398766.jpg";
[self.imageView loadImageWithPath:path defaultImage:nil];
}
就两种方法比较而言,还是类扩展的方法比较好,如果以后遇到需要网络加载图片的问题,可以将封装好的类拿过来直接用。
原文地址:http://blog.csdn.net/qq_27364431/article/details/46365641