美文网首页
GCD线程学习小结

GCD线程学习小结

作者: 马路边的油酥饼 | 来源:发表于2017-02-09 10:30 被阅读0次

GCD的三种队列类型

GCD的核心是dispatch队列。dispatch Block的执行最终会放到某个队列中去。

1. The main queen (主线程串行队列)。通过 dispatch_get_main_queen()获取。

2.Global queen (全局并发队列),通过dispatch_get_global_queen()获取。全局并发队列由全局共享,可以设置高、中、低、后台四个优先级。

3.Custom queen (自定义队列)可以串行,也可以并发。通过dispatch_queen_create()获取。

4.Group queen(队列组),将多线程分组,最大的好处获知所有线程的执行情况。通过dispatch_group_create()获取。通过dispatch_group_notify监听线程的执行情况。

dispatch_sync同步执行任务函数,不会开启新的线程。dispatch_async异步执行任务函数,会开启新的线程。

1.在主线程串行队列中执行同步任务会造成线程死锁, block中的任务永远不会执行。因为dispatch_sync这个函数返回的时候主线程才会往下执行,但这个函数的返回条件是里面的block返回,因为它被插到到了主线程串行队列最后执行,所以dispatch_sync无法返回,主线程串行队列不会执行到最后一个,产生死锁。

dispatch_sync(mainQueen,^){

Nslog(@"mainQueen");

}

2.主线程串行队列中执行异步执行任务不会造成死锁。

dispatch_async(mainQueen,^){

Nslog(@"mainQueen");

}

3.从子线程异步返回主线程更新UI,使用方式最多

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(globalQueue, ^{

//子线程异步执行下载任务,防止主线程卡顿

NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

NSError *error;

NSString *htmlData = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

if (htmlData != nil) {

dispatch_queue_t mainQueue = dispatch_get_main_queue();

//异步返回主线程,根据获取的数据,更新UI

dispatch_async(mainQueue, ^{

NSLog(@"根据更新UI界面");

});

} else {

NSLog(@"error when download:%@",error);

}

});

主线程串行队列由系统默认生成,无法使用dispatch_resume()和diapatch_suspend()来控制执行继续或者中断。

Global Queen(全局并发线程),耗时操作,例如读取网络数据、数据库读写、IO等。我们会在另一个线程中执行此操作,然后通知主线程刷新UI。

1.全局并发队列同步执行任务,在主线程中执行会导致页面卡顿。

dispatch_sync(globalQueen,^){

Nslog(@"globalQueen");

}

block中的代码2s后才会执行。

2.全局并发队列异步执行任务,在主线程中执行不会造成页面卡顿。

dispatch_async(globalQueen,^){

Nslog(@"globalQueen");

}

3.多个全局并发队列,异步执行任务

dispatch_async(globalQueen,^){

Nslog(@"老大");

}

dispatch_async(globalQueen,^){

Nslog(@"老二");

}

异步线程的执行顺序是不确定的。几乎同步开始执行

全局并发队列由系统默认生成的,所以无法调用dispatch_resume()和dispatch_suspend()来控制执行继续或中断。

相关文章

  • GCD线程学习小结

    GCD的三种队列类型 GCD的核心是dispatch队列。dispatch Block的执行最终会放到某个队列中去...

  • 十一、ios线程调用学习

    常用线程方式:GCD 一、GCD学习 Grand Central Dispatch(GCD) 是 Apple 开发...

  • iOS-多线程

    iOS开发中常用的几种多线程方案,简单做个小结,方便日后查阅。 NSThead GCD NSOperation &...

  • iOS开发-多线程学习

    iOS开发中常用的几种多线程方案,简单做个小结,方便日后查阅。 Pthreads NSThead GCD NSOp...

  • GCD(一) 队列、任务、串行、并发

    本文是GCD多线程编程基础内容的小结,通过本文,你可以了解到: 多线程的几个基本概念:进程与线程、串行与并发 GC...

  • iOS实录16:GCD使用小结(二)

    iOS实录16:GCD使用小结(二) iOS实录16:GCD使用小结(二)

  • GCD 多线程 小结

    原文链接:http://yupeng.fun/2019/10/30/gcd/ 本文是对 iOS 中 GCD (Gr...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • GCD(二) dispatch_barrier

    本文是GCD多线程编程中dispatch_barrier内容的小结,通过本文,你可以了解到: dispatch_b...

  • GCD(三) dispatch_group

    本文是GCD多线程编程中dispatch_group内容的小结,通过本文,你可以了解到: 如何使用dispatch...

网友评论

      本文标题:GCD线程学习小结

      本文链接:https://www.haomeiwen.com/subject/fyqbittx.html