多线程之GCD(grand central dispatch)中心调度

为了简化多线程的操作,iOS为我们提供了GCD来实现编程。

使用GCD只要遵守两个步骤即可:

  1. 创建对列(串行队列,并行队列)
  2. 将任务提交给队列

串行队列(同步提交,异步提交)

创建一个串行队列:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);

向队列提交任务,包括同步和异步:

dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"线程一:%d",[NSThread isMainThread]);
});
dispatch_sync(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"线程二:%d",[NSThread isMainThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"线程三:%d",[NSThread isMainThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"线程四:%d",[NSThread isMainThread]);
});

上面的代码在串行队列中提交了四个任务,同步提交,在主线程中,异步提交,在分线程中。

因为是串行队列,打印的顺序是:线程一,线程二,线程三,线程四,一、二是主线程,三、四十是分线程

串行队列可以暂停队列和继续队列:

//暂停队列
dispatch_suspend(queue);
//继续队列
dispatch_resume(queue);

并行队列(同步提交,异步提交)

并行队列我们不需要自己创建,系统为我们提供了方法:

获取并行队列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

在并行队列中,也分为同步提交和异步提交,同步提交在主线程中,异步提交在分线程中。

同步提交的任务还是按照顺序执行,异步提交的任务,顺序不定。

dispatch_sync(queue, ^{
NSLog(@"任务一开始执行");
[NSThread sleepForTimeInterval:2];
NSLog(@"线程:%d",[NSThread isMainThread]);
}); dispatch_sync(queue, ^{
NSLog(@"任务二开始执行");
[NSThread sleepForTimeInterval:2];
NSLog(@"线程:%d",[NSThread isMainThread]);
}); dispatch_async(queue, ^{
NSLog(@"任务三开始执行");
[NSThread sleepForTimeInterval:2];
NSLog(@"线程:%d",[NSThread isMainThread]);
}); dispatch_async(queue, ^{
NSLog(@"任务四开始执行");
[NSThread sleepForTimeInterval:2];
NSLog(@"线程:%d",[NSThread isMainThread]);
});

任务一,任务二十同步提交,按照顺序执行,执行完后,执行三,四,因为三,四是异步提交,同时执行,顺序不定。

其它常用方法

获取主线程队列:

dispatch_queue_t mainQueue = dispatch_get_main_queue();

指定时间执行该代码块:

dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)

将代码以异步方式提交给指定队列,该队列底层的线程池将多次重复执行该代码块

dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)

将代码提交给指定队列,该队列底层的线程池控制在应用的某个生命周期内仅执行该函数一次

dispatch_once(<#dispatch_once_t *predicate#>, <#^(void)block#>)

iOS-多线程(3)的更多相关文章

  1. iOS多线程主题

    下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  3. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  4. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. iOS多线程学习及总结

    能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一.      iOS有三种多线程编程的技术,分别是: 1.        NSThread 2.        Cocoa NSOp ...

  8. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  10. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

随机推荐

  1. 1003: Redraiment的遭遇

    1003: Redraiment的遭遇 Time Limit: 1000 Sec  Memory Limit: 128 MBSubmit: 456  Solved: 158[Submit][Statu ...

  2. javaweb基础(16)_jsp指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  3. Luogu P1666 前缀单词

    校内资格赛题目,差点高一就要\(\tt{AFO}\)了 30分思路 对30%的数据,满足$1≤n≤10 $ 所以我们可以子集枚举,实际得分40pts #include<iostream> ...

  4. Windows系统安装docker

    下载安装包 官网 点击 Get Started ,打开入门页面,往下拉,找到 Download for Windows 打开 下载页面 ,点击 Please Login To Download ,要注 ...

  5. iOS 多线程编程

    参考文章: iOS多线程编程之NSThread的使用http://blog.csdn.net/totogo2010/article/details/8010231 iOS多线程编程之NSOperati ...

  6. iOS 绘制1像素的线

    一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...

  7. Codevs1081 线段树练习 2

    题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...

  8. redis cluster 配置

    #服务器192.168.56.111 192.168.56.112 192.168.56.113 计划1主2从   192.168.56.111 192.168.56.112 192.168.56.1 ...

  9. destoon去除编辑器替换图片删除原图功能,删除信息删除相关图片功能

    去除这些功能会造成大量垃圾图片,但是客户存在大量复制内容,其中图片一样,为了防止客户替换其中一个图片或者删除信息 造成其他复制信息图片丢失 去除文章模型级联图片功能. 对应模块class.php se ...

  10. Python中re(正则表达式)模块使用方法

    Python中常用的正则表达式处理函数: re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood ...