前面一二也说过,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);
来源:oschina
链接:https://my.oschina.net/u/173728/blog/116413