IOS 使用GCD改善性能

1.GCD介绍

  GCD:Grand Central Dispathch,核心中央调度,是一种异步技术。但是它是系统级的。

  负责管理队列,是线程之上的抽象层。队列可以并行或串行运行,能够在系统级自动管理和优化线程。把任务放到队列里执行,一个任务可以是一个函数或一个block。

1.1.多线程分类

  以下的抽象度和底层函数级别从低到高。

1.1.1. PThread 

  已经抛弃了

1.1.2. NSThread

  几乎不用

1.1.3. NSOperation

  多用于网络下载,但是现在都用开源库,例如:AFNetWorking

1.1.4. GCD

  多用于本地解析数据。

1.2. GCD概念说明

  GCD中的队列称之为 dispatch queue,分类为三类:

1.2.1. main dispatch queue

  • 系统提供
  • 主线程
  • 全局性的
  • serial queue,串行,同一时间只能执行一个任务。
  • 用途:UI操作相关,主线程执行。
  • 用法:宏 dipatch_get_main_queue()

1.2.3. global dispatch queue

  • 系统提供
  • 并发执行
  • 用法:函数 dispatch_get_global_queue(0,0),第一个参数为优先级,第二个参数现在没有意义,都是0。

  

1.2.3. 自定义的 dispatch queue

  • 同时只能执行一个任务
  • 用途:用于同步访问特定的资源
  • 实时性没有太高要求的
  • 函数:dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);

2. GCD使用

2.1. 同步提交

  • void dispath_sync(dispatch_queue_t queue, dispatch_block_t block);
  • 阻塞线程
  • Demo
    - (void)syncDownload{
      //同步下载,阻塞主线程
      NSURL *url = [NSURL URLWithString:@""];
      NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
      UIImage *image = [[[UIImage alloc] initWithData:data] autorelease];
      _imageView.image = image; 
    }    

     

2.2. 异步提交

  • void dispath_async(dispatch_queue_t queue, dispatch_block_t block);
  • 后台执行
  • Demo
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //耗时的操作
        NSURL *url = [NSURL URLWithString:@""];
        NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
        UIImage *image = [[[UIImage alloc] initWithData:data] autorelease];
        
        dispatch_async(dispatch_get_main_queue(),^{ 
            //更新界面 
            _imageView.image = image;
        }); 
    });    

     

 

posted on 2015-10-28 19:43  大木哥  阅读(212)  评论(0编辑  收藏  举报

导航