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

前面一二也说过,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。 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);

因而可知,GCD的使用很是简单。
相关文章
相关标签/搜索