iOS开发-多线程编程

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值