NSOperation 简单使用

本文详细介绍了NSOperation队列的基本使用方法,包括队列的创建、并发线程数量的设置、操作的异步执行及顺序执行通过依赖关系实现。此外,还展示了如何在队列中添加操作并控制队列的暂停与继续。

NSOperation 是一种多线程技术 ,起基本原理是把相应地操作放在队列里边 ,然后有队列分发处理。

队列的创建

/**
 *  初始化一个队列
 *
 *  @return 初始化好的对列
 */
- (NSOperationQueue *)myQueue {
    if (_myQueue == nil)
    {
        _myQueue = [[NSOperationQueue alloc] init];
    }
    return _myQueue;
    
}
向队列中添加操作

#pragma mark - 同时并发线程数量
/**
 *  在队列中添加操作
 */
- (void)opDemo1
{
    
    // 线程开启的数量是由GCD底层来决定的,程序员不能参与
    // Mac 10.10 + Xcode 6.0.1 GCD & NSOperation => 能建立 60~70 个线程
    /**
     设置最大并发数的好处,线程开启有消耗
     3G     :   2~3条线程就可以了,线程少,流量少,省钱,省电
     WIFI   :   5~6条线程就可以了,线程多,效率高,流量大,不花钱,可以随时充电!
     */
    // NSOperation提供过了一个属性->最大并发线程数量
    self.myQueue.maxConcurrentOperationCount = 3;
    for (int i = 0; i < 100; i++)
    {
        [self.myQueue addOperationWithBlock:^{
            // 阻塞自己的操作
            [NSThread sleepForTimeInterval:0.5];
            NSLog(@"%@ %d", [NSThread currentThread], i);
        }];
    }
}

队列可以暂停和继续

- (IBAction)pause {
    
    // 先判断队列中是否有操作
    
    if (self.myQueue.operationCount == 0) {
        
        NSLog(@"无操作");
        
        return;
        
    }
    // 挂起-》暂停,暂停的是队列,让队列暂时不再派发任务
    NSLog(@"暂停");
    [self.myQueue setSuspended:YES];
}

- (IBAction)resumue
{
    // 先判断队列中是否有操作
    if (self.myQueue.operationCount == 0)
    {
        NSLog(@"无操作");
        return;
    }
    NSLog(@"继续");
    [self.myQueue setSuspended:NO];
    
}

队列里边的操作默认是异步的

但是可以添加依赖关系 ,从而实现顺序执行的需求

/**
 *  NSInvocationOperation 测试样例
 */
- (void)opDemo4
{
    NSInvocationOperation *invocationOperation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo4Test1) object:nil];
    NSInvocationOperation *invocationOperation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo4Test2) object:nil];
    NSInvocationOperation *invocationOperation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo4Test3) object:nil];
    NSInvocationOperation *invocationOperation4 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo4Test4) object:nil];
    /**
     *  添加依赖关系
     */
    [invocationOperation2 addDependency:invocationOperation1];
    [invocationOperation3 addDependency:invocationOperation2];
    [invocationOperation4 addDependency:invocationOperation3];
    [self.myQueue addOperations:@[invocationOperation1, invocationOperation2, invocationOperation3,invocationOperation4] waitUntilFinished:NO];
    
}
- (void)demo4Test1
{
    NSLog(@"test1  %@",[NSThread currentThread]);
}
- (void)demo4Test2
{
    NSLog(@"test2  %@",[NSThread currentThread]);
}
- (void)demo4Test3
{
    NSLog(@"test3  %@",[NSThread currentThread]);
}
- (void)demo4Test4
{
    NSLog(@"test4  %@",[NSThread currentThread]);
}
#pragma mark - 操作的依赖->操作的执行顺序
/**
 *  NSBlockOperation 测试阳历
 */
- (void)opDemo3
{
    
    /**
     测试的操作
     例如:
     1. 下载小电影压缩包
     2. 解压缩
     3. 保存文件
     4. 通知用户
     */
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        
        NSLog(@"下载 %@", [NSThread currentThread]);
        
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        
        NSLog(@"解压缩 %@", [NSThread currentThread]);
        
    }];
    
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"保存 %@", [NSThread currentThread]);
    }];
    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"通知用户 %@", [NSThread currentThread]);
        
    }];
    // Dependency依赖
    [op2 addDependency:op1];
    [op3 addDependency:op2];
    [op4 addDependency:op3];
    // 一定注意不要出现循环依赖,
    //    [op1 addDependency:op4];
    // waitUntilFinished等待所有操作完成再继续
    //    [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>]
    
    [self.myQueue addOperations:@[op1, op2, op3] waitUntilFinished:NO];
    
    [[NSOperationQueue mainQueue] addOperation:op4];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值