zoukankan      html  css  js  c++  java
  • 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;
          }); 
      });    
  • 相关阅读:
    linux静态链接库
    查看进程运行时间
    进程间同步-互斥量
    Linux——多线程下解决生产消费者模型
    Linux——线程
    浅谈智能指针的历史包袱
    C++ 模板基础
    用信号量为共享内存添加同步机制
    Linux——浅析信号处理
    浅析fork()和底层实现
  • 原文地址:https://www.cnblogs.com/SimonGao/p/4918440.html
Copyright © 2011-2022 走看看