多线程之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. Processing分形之一——Wallpaper

    之前用C语言实现过一些分形,但是代码比较复杂.而对于天生对绘图友好的Processing,及其方便. 在大自然中分形普遍存在,我们用图形模拟,主要是找到一个贴近的函数. 代码 /** * Wallpa ...

  2. linux ecrypt decrypt

    reference ecrypt vickey | openssl enc -aes-256-cbc -a -salt -pass pass:wu decrypt echo U2FsdGVkX1+Hn ...

  3. 02 Django框架基础(APP的创建访问)

    一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...

  4. CSS清除浮动8大方法

    CSS清除浮动是每一位web前端工程师都要掌握的技术,也是让每一位刚入门的前端工程师感到头疼的问题, 下面就来讲一下CSS清除浮动的原理和各种解决方法,大家可以根据实际情况选择最佳的解决方案. 在用D ...

  5. Applied Nonparametric Statistics-lec10

    Ref:https://onlinecourses.science.psu.edu/stat464/print/book/export/html/14 估计CDF The Empirical CDF ...

  6. LeetCode(143) Reorder List

    题目 Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do ...

  7. 计蒜客 The 2018 ACM-ICPC Chinese Collegiate Programming Contest Rolling The Polygon

    include <iostream> #include <cstdio> #include <cstring> #include <string> #i ...

  8. SmartGit 30天评估期结束解决办法

    smartgit 需要输入序列号解决办法: 1.找到路径: %APPDATA%\syntevo\SmartGit\<main-smartgit-version> 然后删除: setting ...

  9. while True 死循环

    while True 死循环示例: count = 0 #给count设置变量为0 while True: count += 1 #每循环一次,count+1 : count += 1 等同于coun ...

  10. .Net Task常见问题

    最近尝试使用一下Task,但是使用过程中因为API的不熟悉碰到了很多问题,不清楚什么时间来调用Task.Start(),具体该怎么使用等等. 如下所描述的Task.Start()方法均为实例方法. 1 ...