IOS多线程主要有三种方式:NSThread,NSOperation,GCD

一,NSThread。

启动:- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
       [thread start];
      + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
  停止:- cancle
      + exit
[self performSelectorOnMainThread:@selector() withObject:obj waitUntilDone:YES];

 

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

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

二,NSOperation。


(1) 并发执行 
  
 
  

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

          - (void)start  
  
 
  
//是否允许并发。默认返回NO
 
  

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

         把NSOperation加入到NSOperationQueue即可启动线程  
  
 
 

      (2)非并发执行 
  
 
  

          -(void)main


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



三,GCD。



  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。在iOS4.0开始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术。现在的iOS系统都升级到6了,所以不用担心该技术不能使用。



  使用起来也很简单:  

(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//线程执行内容
            dispatch_async(dispatch_get_main_queue(), ^{
 //刷新主线程
            });
    });

  如果想要在block里面修改block外的变量,需要加__block修饰变量。

  更详细的用法可参考:http://blog.devtang.com/blog/2012/02/22/use-gcd/

四,NSRunLoop

  NSRunLoop是一个比较大的话题。简单来说,它是用来监控线程的输入源。这里讲的输入源可以是用户输入事件,网络连接(socket收到数据),异步回调(比如在线程中使用NSURLConnection就要用到NSRunLoop,否则它的delegate就不会被调用,因为线程在发送URL请求的时候就结束了),还有就是定时或延迟事件(NSTimer)。每一个线程都会有一个runloop,主线程是自动启动的,而子线程就要手动启动。

  举个例子在子线程使用NSURLConnection时,在queue的start方法中:

while(_connection != nil) {
            [[NSRunLoopcurrentRunLoop] runMode:NSDefaultRunLoopModebeforeDate:[NSDatedistantFuture]];
        }

  这样线程就会等到接收到异步数据时,把_connection设为nil时才结束。整个while循环时是不会耗费cpu资源的,因为runloop会休眠,等到被唤醒才会工作。

 

比较NSOperation和gcd:

共同:都是隐式的使用NSThread

前者:oc-based。更简单,而且方便管理多个线程,还可以管理他们的优先级。实现的时候处理比较多加锁机制,是重量级。而且它是gcd之上的抽象,更高级。

后者:c-based。轻量级