首页 技术 正文
技术 2022年11月8日
0 收藏 785 点赞 1,488 浏览 1826 个字

GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式。 在Mac OS X 10.6和IOS 4.0之后开始支持GCD

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。

GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识。

在开始之前,需要理解是要提供给GCD队列的是代码块(block),用于在系统或者用户创建的的队列上调度运行。

block可以看作一个增强型的函数指针,可为变量赋值,也可以作为参数传递给函数或方法,当然也可以执行。

GCD相对来说是一种更优雅的方式,看如下代码:

NSString* parameter = [self getSomeParameter];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSString* result = [self fetchResultFromWebWithParameter:parameter];

dispatch_async(dispatch_get_main_queue(),

^{ [self updateUIWithResult:result];

});

代码中,出现了一种奇怪的格式:^{code…}

解释一下,当一段代码被花括号包裹并在开头放置上尖号时,我们称之为块(block)。如果你学过C语言的话(实际上,block正是apple对C的一个扩 展), 你可以认为这是一个增强型的函数指针。它不仅可以当做一个变量来回传递,还可以引用本身环境之外的变量(如上面代码中的parameter)。 更进一步地说,它是apple的C扩展中闭包的实现。在block里引用的对象会自动被retain,因此你也不必担心内存的问题。

另外涉及到了三个函数

void dispatch_async( dispatch_queue_t queue, dispatch_block_t block);

dispatch_queue_t dispatch_get_global_queue( long priority, unsigned long flags);

dispatch_get_main_queue();

dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。

dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留    字段备用(一般为0)。

dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面(比如上面代码中的[self updateUIWithResult:result])的情况。

好的,知道这些特性之后,我们可以这样理解上面的代码:利用parameter变量异步地发起一个网络请求,并在请求之后更新UI线程

BLOCK

1. ^( 传人参数列) {函数体;};

举个例子int result = ^(int a) {return a*a;} (5); 表示返回传人参数的平方值。

2.返回值 ^(函数指针名) (传人参数列);

int (^sillyBlock)(int);      sillyBlock= ^(int a) {return a*a;}  ; int result = sillyBlock(5);

3.作为函数参数传人

int (^mySqaure) (int) = ^(int a) {return a*a;}; //定义一个有函数实体的block pointer

myFunction( mySqaure ) ; //作为参数传人

4.OC方法传人值的话需要把类型写在函数指针前面,然后加小括号

-(void) objcMethod:( int (^) (int) ) square; // square 参数的类型是 int (^) (int)

关于block详细内容可参考以下连接

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898