iOS开发——GCD多线程详解
GCD多线程详解
1. 什么是GCD
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程编程
2. 简单使用GCD
/**
* 在主线程执行
*/
dispatch_async(dispatch_get_main_queue(), ^{
;
});
/**
* 在后台线程执行
*/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
;
});
/**
* 只执行一次
* (特别适合在单例中使用)
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
;
});
/**
* 延迟X秒执行
*/
double delayTime = 2.0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
;
});
3. GCD多线程的坑
- 由于使用Block作为线程执行方法,所以Block的坑都要注意,比如
__weak、__block等 - 所有的UI变化都要在主线程完成,后台线程的UI变化代码不会立即起作用,只有在主线程改变UI才能立即起变化
4. GCD高级用法
- 创建串行线程
串行线程对于一些需要串行运行的代码来说非常有用,比如说数据库的操作或者文件的操作
/**
* 创建一个串行线程队列SerialQuene,一次只执行一个任务
*
* @param "com.SerialQuene" 队列名,一般为com.quene名字
* @param NULL NULL就创建Serial线程
*
*/
dispatch_queue_t serialQuene = dispatch_queue_create("com.SerialQuene", NULL);
- 创建并行线程
/**
* 创建一个并行线程队列ConcurrentQuene,一次能并行执行多个任务,完成的时间不定
*
* @param "com.ConcurrentQuene" 队列名,一般为com.quene名字
* @param DISPATCH_QUEUE_CONCURRENT 创建一个并行Concurrent线程
*
*/
dispatch_queue_t concurrentQuene = dispatch_queue_create("com.ConcurrentQuene", DISPATCH_QUEUE_CONCURRENT);
- 在同一个线程组执行多个线程,并在线程都执行完毕后做出响应
/**
* 创建一个Group,在Group中执行的线程都结束了以后会通知notify执行
*/
dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, quene, ^{
NSLog(@"1");
});
dispatch_group_async(group, quene, ^{
NSLog(@"2");
});
dispatch_group_async(group, quene, ^{
NSLog(@"3");
});
dispatch_group_notify(group, quene, ^{
NSLog(@"等到group所有线程全都执行完了以后才会执行");
});
iOS开发——GCD多线程详解的更多相关文章
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- iOS开发-继承特征详解
面向对象的三大特性:封装,继承,多态. 1.继承 继承既能保证类的完整,又能简化代码. 把公共的方法和实例变量写在子类,子类只需要写父类独有的实例变量和方法即可. 继承是面向对象三大特性之一,合理的继 ...
- ios开发之--UIViewContentMode详解
在开发当中有时会有这样的需求,将从服务器端下载下来的图片添加到imageView 当中展示,但是下载下来的图片尺寸大小不固定,宽高也有可能不成比例 如果直接设置imageView的image属性而不设 ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...
- ios开发之多线程---GCD
一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...
- iOS开发之多线程(NSThread、NSOperation、GCD)
整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...
- iOS开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
随机推荐
- js设置cookie过期及清除浏览器对应名称的cookie
js设置cookie过期也就相当于清除浏览器对应名称的cookie的例子. 代码: function ClearCookie() { var expires = new Date(); expir ...
- PHP学习心得(三)——处理表单
表单的任何元素都在 PHP 脚本中自动生效. 一个简单的 HTML 表单: <form action="action.php" method="post" ...
- Python设计模式——工厂方法模式(FactoryMethod)
需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...
- hdu 4570 Multi-bit Trie 区间DP入门
Multi-bit Trie 题意:将长度为n(n <= 64)的序列分成若干段,每段的数字个数不超过20,且每段的内存定义为段首的值乘以2^(段的长度):问这段序列总的内存最小为多少? 思路: ...
- c语言的一些基础知识
c语言作为经典语言,这里不再多说了.咱从基础一起探讨吧! 一. 定义一个整型,如果作为局部变量,没有初始化的情况下,它是一个随机的值的,一般情况下输出会是0,但这个0是作为垃圾值的;而如果作为全局变量 ...
- CSS display 属性详解
定义display 属性设置是否及如何显示元素. 继承性: No 说明 这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型,如果使用 display 不 谨慎会很危险,因为可能 ...
- 常用的python模块
http://tiankonghaikuo1000.blog.163.com/blog/static/18231597200812424255338/ adodb:我们领导推荐的数据库连接组件bsdd ...
- 一个用于清除loadrunner产生log文件的批处理
@echo off set work_path="%~dp0" for /R %%s in (*.txt,*.log) do ( del /f "%%s" ) ...
- 【NOIP 2013 DAY2 T3】 华容道(spfa)
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- [Gauss]POJ1681 Painter's Problem
和POJ1222(分析)完全相同 题意也类似, 可以涂自己以及上下左右五个位置的颜色 问几次能全部涂色 不能输出inf 01方程组 用异或来求解就好了 ][]; // 增广矩阵 ]; // 解 ]; ...