iOS - GCD与多线程

iOS线程

线程是可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位。线程之间共用堆,自有栈iOS主线程栈大小为1M,其它线程为512K

 

iOS有三种多线程编程的技术,分别是:

1.NSThread 

2CocoaNSOperation iOS多线程编程之NSOperationNSOperationQueue的使用

3GCD  全称:Grand CentralDispatch iOS多线程编程之GrandCentral Dispatch(GCD)介绍和使用

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

 

NSThread

优点:NSThread 比其他两个轻量级

缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。

 

NSOperation 

优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。

Cocoa operation 相关的类是 NSOperation NSOperationQueueNSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation NSBlockOperation。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。

 

GCD

Grand Central Dispatch(GCD)Apple开发的一个多核编程的解决方法。GCD是一个替代诸如NSThread,NSOperationQueue, NSInvocationOperation等技术的很高效和强大的新技术。

 

1.NSThread

有三种用法,

 (1) 直接创建线程并且开始运行线程:

[NSThreaddetachNewThreadSelector:@selector(threadInMainMethod:) toTarget:selfwithObject:nil];

 

(2) 先创建线程对象,然后再运行线程操作:

NSThread* myThread =[[NSThread alloc] initWithTarget:self selector:@selector (threadInMainMethod:)object:nil];

[myThread start];

 

(3)NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:

[ObjperformSelectorInBackground:@selector(doSomething) withObject:nil];

 

2. NSOperation 

NSOpertaion2种形式

(1) 并发执行

并发执行你需要重载如下4个方法

//执行任务主函数,线程运行的入口函数

    -(void)start

      //是否允许并发,返回YES,允许并发,返回NO不允许。默认返回NO

   -(BOOL)isConcurrent

    -(BOOL)isExecuting

    //是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOpertaion不能正常释放。

   -(BOOL)isFinished

比如TestNSOperation:NSoperaion 重载上述的4个方法,

 

声明一个NSOperationQueue, 

NSOperationQueue *queue= [[[NSOperationQueue alloc ] init] autorelease];

  [queueaddOperation:testNSoperation];

 

它会自动调用TestNSOperation里的 start函数,如果需要多个NSOperation,你需要设置queue的一些属性,如果多个NSOperation之间又依赖关系,也可以设置,具体可以参考API 文档。

 

2)非并发执行

-(void)main

只需要重载这个main方法就可以了。

 

3. GCD

 

//  后台执行:
 dispatch_async(dispatch_get_global_queue(
0, 0), ^{
      // something

 });

// 主线程执行:
 dispatch_async(dispatch_get_main_queue(), ^
{
      // something

 });

// 一次性执行:
 
static dispatch_once_t onceToken;
 dispatch_once(
&onceToken, ^{
     // code to be executed once

 });

// 延迟2秒执行:
 
double delayInSeconds = 2.0;
 dispatch_time_t popTime
=dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
 dispatch_after(popTime,dispatch_get_main_queue(),
^(void){
     // code to be executed on the mainqueue after delay

 });

// 自定义dispatch_queue_t
 dispatch_queue_t urls_queue =dispatch_queue_create(
"blog.devtang.com", NULL);
 dispatch_async(urls_queue,
^
// your code

 });
 dispatch_release(urls_queue);

// 合并汇总结果
 dispatch_group_t group =
dispatch_group_create();
 dispatch_group_async(group,dispatch_get_global_queue(0
,0), ^{
      //
并行执行的线程一
 });
 dispatch_group_async(group,dispatch_get_global_queue(0
,0), ^{
      //
并行执行的线程二
 });
 dispatch_group_notify(group,dispatch_get_global_queue(0
,0), ^{
      //
汇总结果
 });

 

 

参考下文

http://blog.csdn.net/zhangao0086/article/details/38904923

http://blog.csdn.net/totogo2010/article/details/8010231

http://bbs.9ria.com/thread-208749-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值