按照抽象层次,有三种多线程编程方法。
一、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还没弄明白。所以就没代码。