1.、NSThread

2、CocoaNSOperation

3、GCD 全称:Grand Central Dispatch

这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。

主线程和子线程的主要区别是:主线程处理和UI相关的操作 子线程通过[obj performSelectorOnMainThread]回到主线程


NSOperation和GCD两者直接有什么区别呢?

GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;

在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);

NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;

我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌控我们执行的后台任务;

在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码;

我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。



dispatch queue分为下面三种:

Serial(连续的 系列的)

又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

Concurrent (同时发生的)

又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。

Main dispatch queue

它是全局可用的 在应用程序主线程上执行任务的。


1、常用的方法dispatch_async

为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。

用GCD实现这个流程的操作比前面介绍的NSThread NSOperation的方法都要简单。代码框架结构如下:


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
        // 耗时的操作
      dispatch_async(dispatch_get_main_queue(), ^{
            // 更新界面
        });
    });
  /*
     *系统给每一个应用程序提供了三个concurrent dispatch queues。
     *这三个并发调度队列是全局的,它们只有优先级的不同。
     *因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列
     */




2、dispatch_group_async的使用

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);  
dispatch_group_t group =dispatch_group_create();  
dispatch_group_async(group, queue,^{  
   [NSThread sleepForTimeInterval:1]; 
   NSLog(@"group1");  
});  
dispatch_group_async(group, queue, ^{  
   [NSThread sleepForTimeInterval:2]; 
   NSLog(@"group2");  
});  
dispatch_group_async(group, queue,^{  
   [NSThread sleepForTimeInterval:3]; 
   NSLog(@"group3");  
});  
dispatch_group_notify(group,dispatch_get_main_queue(), ^{  
    NSLog(@"updateUi");  
});  
 


3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:

dispatch_queue_t queue =dispatch_queue_create("gcdtest.rongfzh.yc",DISPATCH_QUEUE_CONCURRENT);  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:2]; 
    NSLog(@"dispatch_async1");  
});  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:4]; 
    NSLog(@"dispatch_async2");  
});  
dispatch_barrier_async(queue, ^{  
   NSLog(@"dispatch_barrier_async");  
   [NSThread sleepForTimeInterval:4]; 

});  
dispatch_async(queue, ^{  
   [NSThread sleepForTimeInterval:1]; 
    NSLog(@"dispatch_async3");  
}); 
 


4、dispatch_apply
执行某个代码片段N次。

dispatch_apply(N, globalQ, ^(size_tindex) {

});