多线程之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. JavaScript实现页面到滚动到指定位置执行某些操作

    比如 页面中 某个DOM, 希望点击按钮后页面直接跳转到 这个DOM所在的位置, 1. 获取DOM离屏幕的高度 var hTop = $('#box').offset().top; $('body,h ...

  2. Hicharts图表的使用

    Hicharts图表的使用 引用 在4.0之后就不需要jQuery了,z这里是用ajax向后台发送数据 引入js或者CDN,这里采用的是引入js的方式 在Hicarts文件中的index中查看相应的图 ...

  3. C++链表简单的应用

    学生管理系统,输入学生的姓名和学号,然后再输出: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib ...

  4. Web前端 优化方案

    1.减少Http请求  在一个页面中图片,CSS,JS可能N个,如果每个资源都去请求一次服务器的话,那么服务器就会为每个资源开一个线程来完成,这样的话对服务器的压力就很大了.所以解决的方法就是合并资源 ...

  5. centos启动流程

    centos6启动流程 1.主板,post加电自检,检查硬件环境 2.主板选择一个硬盘进行引导,执行mbr446 grub stage1 3.grub stage1.5 加载/boot分区文件系统驱动 ...

  6. 201621123080《java程序设计》第14周实验总结

    201621123080<java程序设计>第14周实验总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2. ...

  7. JQ之$.ajax()方法以及ajax跨域请求

    AJAX(Asynchronous javascript AND xml :异步javascript和xml):是一种创建交互式网页应用的网页开发技术.AJAX可以在不重新加载整个页面的情况下与服务器 ...

  8. python入门:输出1-10的所有数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #输出1-10的所有数 """ 变量kaishi的赋值为数字1,while 真, ...

  9. 设置mysql允许外部连接访问

    错误信息: SQL Error (1130): Host ‘192.168.1.88’ is not allowed to connect to this MySQL server 说明所连接的用户帐 ...

  10. css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果