按照抽象层次,有三种多线程编程方法。
一、NSThread
需要管理线程的生命周期、同步、加锁问题,导致一定的性能开销。

//1.动态方法
{
//初始化线程
NSThread *thread=[[NSThread alloc]initWithTarget:self @selector(run) object:nil];
//设置优先级
thread.threadPriority=1;
//开启线程
[thread start];
}

//2.静态方法
{
    //调用完毕,会马上创建并开启线程
    [NSThread detachNewThreadSelector:@selector(run) withObject:nil];
}

//3.隐式创建线程
{
    [self performSelectorInBackground:@selector(run) withObject:nil];
}

//4.获取当前线程
{
    NSThread *thread=[NSThread currentThread];
}

//5.获取主线程
{
    NSThread *thread=[NSThread mainThread];
}

//6.暂停当前线程
{
    //Method one
    [NSThread sleepForTimeInteval:2];
    //Method two
    NSDate *date=[NSDate dateWithTimeInteval:2 sinceDate:[NSDate date]];
    [NSThread sleepUntilDate:date];
}
//7.线程间通信
{
    //指定线程上执行通信
    [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];

    //在主线程上执行操作
    [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];

    //在当前线程上执行操作
    [self performSelector:@selector(run) withObject:nil];
}

二、NSOperation
1、实例封装了需要执行的操作和操作所需的数据,并以并发或非并发的方式执行这个操作。
NSOperation是一个抽象类,必须使用它的子类,2种方式:
~1 NSInvocationOperation和NSBlockOperation
~2 自定义子类基层NSOperation,实现内部相应的方法

2、执行操作
调用start方法开始执行操作,默认按同步的方式执行。

3、取消操作

[operation cancel];

4、监听操作的执行
需要在执行完毕后做一些事情,就调用setCompletionBlock方法设置

{
    //Method one
    operation.completionBlock=^(){
        //coding.
    }

    //Method two
    [operation setCompletionBlock:^(){}];
}

5.NSInvocationOperation
基于一个对象和selector来创建。

{
    //创建并执行
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
    [operation start];
}

6、NSBlockOperation
并发,一个或者多个block对象。

NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^(){}];
[operaion start];

7、通过addExecutionBlock方法添加block操作

[operation addExecutionBlock:^(){
    //code
}];

8、NSOperationQueue
将NSOperation添加到一个NSOperationQueue中异步执行。

//创建一个队列
NSOperationQueue *queue=[[NSOperationQueue alloc]init];

//添加一个操作到队列中
[queue addOperation:operation];

//添加一系列操作到队列中
[queue addOperations:operations waitUntilFinished:NO];

//添加一个block操作
[queue addOperationWithBlock:^(){
    NSLog(@"线程:%@",[NSThread currentThread]);
}];

9、添加NSOperation的依赖对象
某个NSOperation对象依赖于其他NSOperation对象时,就通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都完成后,当前的NSOperation才会开始执行操作。

[operation2 addDependency:operation1];

另外,通过removeDependency方法删除依赖对象。不局限于相同queue中的NSOperation对象。唯一的限制不能创建环形依赖。

10、取消Operations
一旦添加操作到队列中,这个队列有拥有了这个对象,唯一能做的就是取消。

[operation cancel];
[queue cancelAllOperations];

三、GCD
苹果公司推出的解决方案,基于C语言。
使用GCD,完全由系统管理线程,次序定义想要执行的任务,然后添加到适当的调度队列。
遵守FIFO原则。

GCD还没弄明白。所以就没代码。