注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Objective -C的开发之十七队列(GCD)  

2016-04-06 13:44:51|  分类: IOS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Objective -C的开发之十七队列(GCD

在各种语言的编程中,多线程编程都是最复杂最难的。特别是多线程加上异步,简直是对编程人员的一种折磨。当然,做为一门流行的语言,在IOS上进行多线程编程是必须得有的,否则怎么虐待那群代码狗。

ISO的多线程编程有三种:

1NSThread

2Grand Centeral Dispatch(GCD)

3NSOperationNSOperationQueue

今天主要谈一下第二种GCD。其它两个会在下一些的篇幅里进行说明。

GCD是基于C语言的底层API实现的一套多线程并发机制,非常的灵活方便,个人看来类似于C++中的线程池中的队列操作部分(C++的线程池有两种主要的机制,一个是直接在指针里传递参数;另外一个就是去操作阻塞队列;JAVA中也有类似的机制)。它的基本形式如下:

GCD使用很简洁的记述方法,实现了极为复杂繁琐的多线程编程。

dispatch_async(queue, ^{

     //长时间处理

     //例如AR用动画识别

     //例如数据库访问

     //长时间处理结束,主线程使用该处理结果

     dispatch_async( dispatch_get_main_queue(), ^{

     //只在主线程可以执行的处理

     //例如用户界面更新

     });

});

队列分为三种:

1、连续队列也即串行队列。这个应该容易理解,就是排队来,不许插队,一个个的执行(FIDO)。

2、并发队列。并发队列就好像线程里的,多个任务可以同时执行(请注意这个同时,是在不同的环境下有不同的意义),需要说明的是,你无法创建并发队列,只能从系统提供的3个队列中选择一个来使用。

这个也遵循FIFO的调试方式,但是它却可以同时执行几个任务。每个应用程序都有三种并发队列可用,即高优先级,默认优先级和低优先级。即:

DISPATCH_QUEUE_PRIORITY_HIGH

DISPATHC_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_LOW

 

3、主队列。这个是应用程序中有效的主队列,执行的是应用程序的主线程任务。

为什么讲到代码块后就直接跳到这里讲队列呢?为会么不谈人生不谈感想呢?主要原因是,使用代码块可以更方便的操作队列,这和Lambada表达式何其相似?所以说,天下文章一大抄,看你会抄不会抄。

同步:

dispatch_queue_t q_serial = dispatch_queue_create("my_serial_queue", DISPATCH_QUEUE_SERIAL);

dispatch_queue_t q_concurrent = dispatch_queue_create("my_concurrent_queue", DISPATCH_QUEUE_CONCURRENT);

for (int i = 0; i < 5; ++i) {

  dispatch_sync(q_serial, ^{

    NSLog(@"串行队列里的同步任务 %@ %d", [NSThread currentThread], i);

  });

}

for (int i = 0; i < 5; ++i) {

  dispatch_sync(q_concurrent, ^{

    NSLog(@"并行队列里的同步任务 %@ %d", [NSThread currentThread], i);

  });

}

异步:

    dispatch_queue_t q_serial = dispatch_queue_create("my_serial_queue", DISPATCH_QUEUE_SERIAL);

    for(int i = 0; i < 5; ++i){

        dispatch_async(q_serial, ^{

            NSLog(@"串行队列 -- 异步任务 %@ %d", [NSThread currentThread], i);

        });

    }

 

另外在NSObject中还有两种简单的方法实现了多线程技术,来实现上面的GCD

NSObject中,提供了两个实例方法来实现简单的多线程技术:performSelectorInBackground:withObject    performSelectorOnMainThread  我们也可以改用performSelector系方法来实现前面使用的GCD

 

//NSObject  performSelectorInBackgroundwithObject:方法中执行后台线程

- (void)launchThreadByNSObject_performSelectorInBackground_withObject {

     [self performSelectorInBackground:@selector(doWork) withObject:nil];

}

//后台线程处理方法

- (void)doWork {

     @autoreleasepool{

          //长时间处理,   例如AR用画像识别    例如数据库访问

          //长时间处理结束,主线程使用其处理结果

          [self performSelectorOnMainThread:@selector(doneWork) withObject:nil waitUntilDone:NO];

     }

}

//主线程处理方法

- (void)doneWork {

     //只在主线程可以执行的处理

     //例如用户界面更新

}

 

performSelector系方法确实比使用NSThread简单,但是相比GCD,却有所不及。

但是这个还是有一些应用上的不方便之处。

  评论这张
 
阅读(299)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017