多线程之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. k8s1.13.0二进制部署-master节点(三)

    部署apiserver 创建生成CSR的JSON配置文件 [root@k8s-master1 ssl]# vim kubernetes-csr.json { "CN": " ...

  2. js生成指定范围内随机数

    其现方法的核心是JavaScript的Math对象.代码如下: <!DOCTYPE html> <html lang="en"> <head> ...

  3. 《剑指offer》56 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   在线练习:https://www.nowcoder.com/practice/e02fdb5 ...

  4. Dojo中的选择器

    dom.byId(以前的dojo.byId):等同于js中的document.getElementById. http://www.cnblogs.com/tiandi/archive/2013/11 ...

  5. 反射中 invoke方法 getMethod方法 getClass()方法

    package com.swift; import java.util.*; import java.lang.reflect.*; public class ReflectDemo { public ...

  6. 20180901 JavaScript闭包和匿名函数自动调用

    引用: 1. JavaScript闭包_by runoob 2. JS中(function(){xxx})这么写是什么意思? (一)闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭. ...

  7. 基于matlab的蓝色车牌定位与识别---分割

    接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割 ...

  8. C++ 学习笔记(一) cout 与printf 的不同之处

    作为一个嵌入式开发的猿,使用打印调试程序是必不可少的,拿到新的项目第一件事就是捣鼓打印.这次也不例外有打印才有耍下去的底气.在之前零零碎碎的C++学习中,还是一边学一边做项目的状态下能用printf解 ...

  9. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  10. 【网络基础】【TCP/IP】IP的分级

    节选自 <鸟哥的linux私房菜>  http://cn.linux.vbird.org/linux_server/0110network_basic_3.php#ps12 InterNI ...