您的位置:首页 > 其它

多线程之GCD

2015-12-09 17:49 405 查看
1.进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间
2.线程:线程是进程中一个独立的执行路径(控制单元),一个进程中至少包含一条线程,即主线程(UI操作),可以将耗时的执行路径(如网络请求)放在其他线程中执行,线程不能被杀掉,但是可以暂停/休眠一条线程。
3.创建线程的目的:开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行
4.多线程的优势:充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入"并行运算"状态;将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好;当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整.。
5.弊端:新建线程会消耗内存空间和CPU时间,线程太多会降低系统的运行性能

GCD

全称:Grand Central Dispatch

Grand Central Dispatch (GCD)是发的一个多核编程的解决方法。在iOS4.0开始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术。

常用的方法用dispatch_async和dispatch_group_async的使用

以下是两种方法的使用

第一种方法

[align=left]dispatch_async开启一个异步操作,第一个参数是指定一个gcd队列,第二个参数是分配一个处理事物的程序块到该队列。[/align]
[align=left]dispatch_get_global_queue(0, 0),指用了全局队列。[/align]
[align=left]一般来说系统本身会有3个队列:global_queue、current_queue(废弃)和main_queue[/align]
[align=left]获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低[/align]

[super viewDidLoad];

//第一种方法

dispatch_async(dispatch_get_global_queue(0, 0), ^{

//NSLog(@"耗时操作%@",[NSThread currentThread]);

NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic11.nipic.com/20101127/4357292_141605011689_2.jpg"]];

UIImage *image=[UIImage imageWithData:data];

//返回主线程

dispatch_async(dispatch_get_main_queue(), ^{

//NSLog(@"更新UI%@",[NSThread currentThread]);

imageView.image=image;

});

});

//第二种方式:

UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 50, 50)];

[self.view addSubview:imageView];

UIImageView *imageView1=[[UIImageView alloc]initWithFrame:CGRectMake(50, 100, 50, 50)];

[self.view addSubview:imageView1];

UIImageView *imageView2=[[UIImageView alloc]initWithFrame:CGRectMake(50,150, 50, 50)];

[self.view addSubview:imageView2];

UIImageView *imageView3=[[UIImageView alloc]initWithFrame:CGRectMake(50, 200, 50, 50)];

[self.view addSubview:imageView3];

//组

//创建组:用于存放耗时操作

__block UIImage *image1,*image2,*image3;

//将操作封装进组,第一个参数代表要存放操作的组名,第二个参数代表操作队列,block执行耗时操作

dispatch_group_t group=dispatch_group_create();

dispatch_group_async(group,dispatch_get_global_queue(0, 0) , ^{

NSData *data=[NSDatadataWithContentsOfURL:[NSURLURLWithString:@"http://pic11.nipic.com/20101127/4357292_141605011689_2.jpg"]];

image1=[UIImage imageWithData:data];

NSLog(@"--1%@",image1);

});

dispatch_group_async(group,dispatch_get_global_queue(0, 0) , ^{

NSData *data=[NSDatadataWithContentsOfURL:[NSURLURLWithString:@"http://pic11.nipic.com/20101127/4357292_141605011689_2.jpg"]];

image2=[UIImage imageWithData:data];

//NSLog(@"--2%@",image2);

});

dispatch_group_async(group,dispatch_get_global_queue(0, 0) , ^{

NSData *data=[NSDatadataWithContentsOfURL:[NSURLURLWithString:@"http://pic11.nipic.com/20101127/4357292_141605011689_2.jpg"]];

image3=[UIImage imageWithData:data];

// NSLog(@"--3%@",image3);

});

//监听一组操作,第一个代表要监听的组名,第二个参数代表一组操作完全结束后跳转到那个队列,一般调到主线程(dispatch_get_main_queue)block执行要进行的操作(一般用来更新UI),注意:此方法在组中的所有操作执行完毕后调用(等待组中的任务执行完毕,回到主线程执行block回调)

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

imageView1.image=image1;

imageView2.image=image2;

imageView3.image=image3;

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: