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。

    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的使用非常简单。



你可能感兴趣的:(iOS multiple threads(2)------GCD)