文档章节

iOS multiple threads(2)------GCD

辉兔狼
 辉兔狼
发布于 2013/03/24 13:05
字数 913
阅读 578
收藏 6

前面一二也说过,iOS中多线程编程工具主要有:

  •  NSThread
  • NSOperation
  • GCD

   这三种方法都简单易用,各有千秋.同NSThread相比,GCD的运行效率更高,开发更简单。  但GCD确是诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(新一代的apple设备已经是双核了)

概述

   iOS中,concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面,操作系统把这些任务代码分派到不同的资源 里去处理,一个简单的例子来说,为什么初学者写tableview的时候,滑动列表时总会很卡,因为很多初学者把图片装载放到main thread主线程去执行,例如我们要滑动畅顺的话,iOS最快可以1秒内刷新60次,如何你的一个cell的文字和图片装载超过1/60秒的话,自然就 会卡。所以一般我们会把图片装载这些需要多点时间的移出main thread来处理,对于用GCD来说,就是把图片载入放到另外一个queue队列中来异步执行,当资源准备好了后,放回到main thread中显示出来。main thread在GCD中就是main queue。

    GCD的基础是dispatch queue和block。我们来简单的看下吧:

1. block可以简单理解为一个任务。

block在程序中的表现形式类似: 


NSString * URL = @"http://";
 ^{
     UIImage * image = [UIImage imageWithURL:URL];
 };


从上例可以看出,block可以引用外部作用域的数据。这也是很block和普通函数的区别,block会保存当前执行的上下文。

block定义:

int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};

//定义了一个Multiply的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,注意{}blocks体里的;。

//Blocks可以访问局部变量,但是不能修改。

              int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//编译报错
         return num * multiplier;
     };

//如果要修改就要加关键字:__block

         __block int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//这样就可以了
         return num * multiplier;
     };

2. dispatch queue是一个FIFO任务队列,可以将一些block压入这个队列中,系统会按照顺序来执行这些block。

下面首先来看使用:

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

async表明异步运行,block代表的是你要做的事情,queue则是你把任务交给谁来处理了.(除了async,还有sync,delay,本文以async为例).

系统中默认提供了三种dispatch queue:

a. Main. 如果某个block希望在主线程完成,可以将其push到main dispatch queue中。由dispatch_get_main_queue获得.和ui相关的就要使用Main Queue.

b. Concurrent. 系统会自动创建三个不同优先级的dispatch queue。不能保证block严格按照顺序执行。

可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序,结束的顺序依赖各自的任务.使用dispatch_get_global_queue获得.

c. Serial. 需要用户手动创建,能够保证block严格按照push的顺序执行。

每次运行一个任务,可以添加多个,执行次序FIFO. 通常是指程序员生成的,比如:

NSDate *da = [NSDate date];
NSString *daStr = [da description]; constchar*queueName = [daStr UTF8String];
dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);

由此可见,GCD的使用非常简单。



© 著作权归作者所有

共有 人打赏支持
辉兔狼

辉兔狼

粉丝 29
博文 52
码字总数 35345
作品 1
海淀
高级程序员
私信 提问
iphone开发资源汇总

学习过程当中查找到的资料,做一个记录,以便更多朋友查看。 开发的过程有时候是简单的,因为我们可以站在巨人的肩上,跳得更高,走得更远。 如何用Facebook graphic api上传视频: http://d...

长平狐
2012/08/13
466
0
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
iOS多线程编程之NSThread的使用

iOS多线程编程之NSThread的使用 1、简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.、NSThread 2、Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3、GCD 全...

malawo
2013/09/05
0
0
iphone开发资源汇总

iphone开发资源汇总 如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://github.com/carlbrown/PDKeychainBindingsContr......

长平狐
2012/10/25
232
0
关于iOS多线程,这边勉强可以看看(OC&Swift)

iOS开发多线程总是绕不过的坎,看了很多前辈们优秀的文章,如:关于iOS多线程,我说,你听,没准你就懂了!、谈iOS多线程(NSThread、NSOperation、GCD)编程、iOS多线程:『GCD』详尽总结、i...

Andy_Ron
2018/08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python 批量修改图片exif属性

Python 批量修改图片exif属性 一共两个文件 config.ini  //放配置文件 exif.py   //主程序文件 config.ini 文件源码 [global]Artist = www.blmm.com ;作者DateTimeOriginal = now ;时...

阿锋zxf
35分钟前
0
0
一文说尽MySQL事务及ACID特性的实现原理

本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实现原理。MySQL 博大精深,文章疏漏之处在所难免,欢迎批评指正。 MySQL 事务基础概念 事务(Transaction)是访...

架构师springboot
57分钟前
8
0
Vue +Element UI后台管理模板搭建示例

一、蓝色主题 Element ui 后台管理 Demo https://github.com/taylorchen709/vueAdmin https://taylorchen709.github.io/vueAdmin/#/user Element ui 文档 http://element.eleme.io/#/zh-CN/......

tianma3798
今天
3
0
小白学习大数据的最详细的学习路线图就在这里

现如今大数据已经上升到国家战略层面,企业对于大数据的关注和重视程度也在不断提升。想要成为大数据工程师,大需要很多种基础理论知识与编程框架、分布式服务器等来支撑,这也是使得一个大数...

董黎明
今天
10
0
聊聊flink JobManager的High Availability

序 本文主要研究一下flink JobManager的High Availability 配置 flink-conf.yaml high-availability: zookeeperhigh-availability.zookeeper.quorum: zookeeper:2181high-availability.zo......

go4it
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部