前面一二也说过,iOS中多线程编程工具主要有: 程序员
这三种方法都简单易用,各有千秋.同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。 app
GCD的基础是dispatch queue和block。咱们来简单的看下吧: 框架
1. block能够简单理解为一个任务。 异步
block在程序中的表现形式相似: async
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。 ui
下面首先来看使用:
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);