IOS -多线程 - GCD - 初识

1. 什么是GCD

  a. 全称是Grand Center Dispatch

  b. 纯C语言,提供了非常多强大的函数

2. GCD的优势

  a. GCD是苹果公司为多核的并行运算提出的解决方案

  b. GCD会自动利用更多的CPU内核(比如双核、四核)

  c. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

  d. 程序员只要告诉GCD想要执行什么任务,不需要编写任何线程管理的代码

3. GCD两个核心概念--任务和队列

  任务:要执行的操作(方法) 使用block封装,block 就是一个提前准备好的代码块,在需要的时候执行

    执行任务的函数

    同步执行:当前指令不完成 , 不会执行下一条指令    dispatch_sync (队列,任务)

    异步执行:当前指令不完成 , 可以执行下一条指令    dispatch_async (队列, 任务)

  队列:用来存放任务的集合

    串行队列:一个接一个的调度任务       dispatch_queue_t q = dispatch_queue_create("js", NULL);

    并发队列:可以同时调度多个任务       dispatch_queue_t q = dispatch_queue_create("js", DISPATCH_QUEUE_CONCURRENT);

    主队列:全局串行队列,由主线程串行调度任务,并且只有一个  dispatch_queue_t q = dispatch_get_main_queue();

    全局队列:没有名称的并发队列        dispatch_queue_t q = dispatch_get_global_queue(0, 0);

4. GCD使用步骤

  a. 定制任务:确定想做的事情

  b. 将任务添加到队列中,并按照指定的同步或异步方式执行任务

    i. GCD会自动将队列中的任务取出,放到对应的线程中执行

    ii. 任务的取出遵循队列的FIFO原则,先进先出

5.代码示例:

  a.同步执行

//1 队列 此队列是全局的
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2 任务
void (^task)() = ^{
  [NSThread sleepForTimeInterval:1];
  NSLog(@"%@",[NSThread currentThread]);
};
//3 添加到队列,并指定执行方法
//同步执行,此方法不会开启线程

dispatch_sync(q, task);
NSLog(@"over");

  b.异步执行

//异步执行,会开启新线程
//此方法只是把任务添加到队列,然后gcd管理的线程池中有空闲线程就会从队列中取任务执行//1 队列 此队列是全局的
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
//2 任务
void (^task)() = ^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@"%@",[NSThread currentThread]);
};

dispatch_async(q, task);

NSLog(@"over");

  c.线程间通讯

//此方法只是把任务添加到队列,然后gcd管理的线程池中有空闲线程就会从队列中取任务执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{ //子线程

NSLog(@"%@",[NSThread currentThread]);

//下载图片
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/pic.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url];

UIImage *image = [UIImage imageWithData:data];

//线程间通讯,给控件赋值,应该在UI线程中
//在gcd中不直接操作线程,只需要把代码放到主队列中就ok
//主队列中的任务是由主线程来调用
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = image;
        [self.imageView sizeToFit];
        self.scrollView.contentSize = image.size;
        self.scrollView.backgroundColor = [UIColor grayColor]; //主线程
        NSLog(@"%@",[NSThread currentThread]);
    });
});

时间: 2024-11-07 17:09:09

IOS -多线程 - GCD - 初识的相关文章

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

深入IOS多线程 GCD(一)

一,什么是GCD GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的dispatch queue中,GCD就能生成必要的线程并计划执行任务.由于线程管理师作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率. 也就是说GCD用我们难以置信的非常简单的记述方法,实现了极为复杂的多线程编程,可以说这是一项划时代的技术.下面是使用了GCD源码的例子,虽然稍微抽象,但从中也能感受到GCD的威力 d

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

iOS 多线程GCD的基本使用

<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 /** * 异步函数 + 并发队列:可以同时开启多条线程 */ - (void)asyncConcurrent { // 1.创建一个并发队列 // dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // label

iOS 多线程 GCD part3:API

https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 #define NSEC_PER_SEC 1000000000ull #define NSEC_PER_MSEC 1000000ull #define USEC_PER_SEC 1000000ull #define NSEC_PER_USEC 1000ull MSEC:毫秒 USEC:微秒 NSE

iOS多线程——GCD篇

什么是GCD GCD是苹果对多线程编程做的一套新的抽象基于C语言层的API,结合Block简化了多线程的操作,使得我们对线程操作能够更加的安全高效. 在GCD出现之前Cocoa框架提供了NSObject类的 performSelectorInBackground:withObject performSelectorOnMainThread 方法来简化多线程编程技术. GCD可以解决以下多线程编程中经常出现的问题:1.数据竞争(比如同时更新一个内存地址) 2.死锁(互相等待) 3.太多线程导致消耗

iOS多线程GCD的简单使用

在iOS开发中,苹果提供了三种多线程技术,分别是: (1)NSThread (2)NSOperation (3)GCD 简单介绍一下GCD的使用. GCD全称 Grand Central Dispatch,可以称之为大中央调度.实际上GCD是管理着一个线程池,如何创建线程,如何回收线程,以及分配多少个线程,这些都是GCD来控制的.在开发中,程序员是不用操作线程的相关事情,程序员只需要把应该做的操作放到相应的队列里面即可. 一:自定义队列 GCD中有多种队列,其中自定义的队列有两种:串行队列和并行

ios多线程-GCD基本用法

ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //异步操作代码块 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程操作代码块 }); }); 比较多的用于更新ui操作 比如从数据库获取数据需要花较长的