iOS的三种多线程技术----NSOperation&NSOperationQueue

简介

NSOperationQueue(操作队列)是由GCD提供的队列模型的Cocoa抽象,是一套Objective-C的API

GCD提供了更加底层的控制,而操作队列则在GCD之上实现了一些方便的功能,这些功能对于开发者而言通常是最好最安全的选择

队列种类

NSOperationQueue有两种不同类型的队列:主队列自定义队列

主队列运行在主线程上

自定义队列在后台执行,自动的创建子线程

操作种类

队列处理的任务是NSOperation的子类NSInvocationOperationNSBlockOperation

基本使用步骤

1.定义操作队列

确定是 主队列 还是 自定义队列

2.定义操作

确定是NSInvocationOperation操作还是NSBlockOperation操作

3.将操作添加到队列

运行

注意:一旦将操作添加到队列,操作就会立即被调度执行

示例代码

<span style="font-size:24px;">#pragma mark -
#pragma mark NSBlockOperation
- (void)demo1
{

//    //确定操作类型
//    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
//        NSLog(@"%@",[NSThread currentThread]);
//    }];
    
    //将操作添加到操作队列
    //所有的自定义的队列,都在子线程上运行
    //设置最大的并发个数.注意,在设定同时并发的最大线程个数时,如果前一个线程工作完成,但是还没有销毁,就会创建新的线程.在网络开发中需要根据用户当前的网络状况设定下载时,最大的并发操作个数(这一点GCD不好做到)
    [self.myQueue setMaxConcurrentOperationCount:3];
    for (int i=0; i<10; i++) {
        [self.myQueue addOperationWithBlock:^{
            NSLog(@"%@",[NSThread currentThread]);
        }];
    }

//    在主线程上执行
//    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
//         NSLog(@"%@",[NSThread currentThread]);
//    }];
}
//NSInvocationOperation
- (void)demo2
{
    //需要定义一个方法 不够灵活
    NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(haha) object:@"hello"];
    
//    [self.myQueue addOperation:invocationOperation];
    
    [[NSOperationQueue mainQueue] addOperation:invocationOperation];
}

- (void)haha
{
    NSLog(@"%@",[NSThread currentThread]);
}


#pragma mark -
#pragma mark 设置任务的执行顺序

- (void)demo3
{
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片 %@",[NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"UI更新图片 %@",[NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"保存图片 %@",[NSThread currentThread]);
    }];
    //为了顺序执行,需要设定操作之间的依赖关系,注意,依赖关系是跨队列的.(这一点牛B)
    [op2 addDependency:op1];
    [op3 addDependency:op2];
</span><p><span style="font-size:14px;">//    [op2 <span style="font-family: Arial, Helvetica, sans-serif;">addDependency:op1]</span><span style="font-family: Arial, Helvetica, sans-serif;">;循环引用,程序会崩溃</span></span></p><span style="font-size:24px;">
    //执行时 会开启多个队列,在GCD串行队列中,只会开启一个线程
    [self.myQueue addOperation:op1];
    //在主线程跟新UI
    [[NSOperationQueue mainQueue] addOperation:op2];
    [self.myQueue addOperation:op3];
}
</span>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值