zoukankan      html  css  js  c++  java
  • 多线程之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;

        });

  • 相关阅读:
    工作笔记(一)
    如何修改mindmanager默认字体为微软雅黑
    彻底解决zend studio 下 assignment in condition警告
    PHP5.2至5.6的新增功能详解
    ThinkPHP中的模型命名
    12大网站建设技巧 让访客信任你
    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
    几种不错的编程字体
    大型网站的灵魂——性能
    MySQL: InnoDB 还是 MyISAM?
  • 原文地址:https://www.cnblogs.com/wyhwyh2114/p/5033642.html
Copyright © 2011-2022 走看看