多线程之GCD

 

  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的使用

以下是两种方法的使用

 

第一种方法

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

 

 [super viewDidLoad];

//第一种方法

 

dispatch_async(dispatch_get_global_queue(00), ^{

   

    //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_queueblock执行要进行的操作(一般用来更新UI),注意:此方法在组中的所有操作执行完毕后调用(等待组中的任务执行完毕,回到主线程执行block回调)

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        imageView1.image=image1;

        imageView2.image=image2;

        imageView3.image=image3;

 

    });

posted on 2015-12-09 17:49  沙->仙人掌  阅读(194)  评论(0编辑  收藏  举报