[IOS 开发] 多线程之 NSBlockOperation和NSInvocationOperation的区别

本篇文章主要介绍下多线程下NSBlockOperation和NSInvocationOperation的区别,列举个栗子给大家说明一下。吐舌头


1.首先介绍 NSBlockOperation:

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"BlockOperation 1 begin");
        sleep(2);  // 加个睡眠模仿耗时操作
        NSLog(@"BlockOperation 1 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 1 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 1 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 2 begin");
        sleep(2);
        NSLog(@"BlockOperation 2 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 2 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 2 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 3 begin");
        sleep(2);
        NSLog(@"BlockOperation 3 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 3 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 3 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 4 begin");
        sleep(2);
        NSLog(@"BlockOperation 4 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 4 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 4 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 5 begin");
        sleep(2);
        NSLog(@"BlockOperation 5 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 5 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 5 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 6 begin");
        sleep(2);
        NSLog(@"BlockOperation 6 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 6 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 6 end");
    }];
    [op addExecutionBlock:^{
        NSLog(@"BlockOperation 7 begin");
        sleep(2);
        NSLog(@"BlockOperation 7 currentThread = %@", [NSThread currentThread]);
        NSLog(@"BlockOperation 7 mainThread    = %@", [NSThread mainThread]);
        NSLog(@"BlockOperation 7 end");
    }];
    
    NSLog(@"start");
    [op start];
    NSLog(@"end");

执行结果:

从执行结果可以看出, NSBlockOperation是优先使用主线程,主线程在忙的情况下再使用子线程。


2.接下来介绍NSInvocationOperation

    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; //初始化操作队列
    [operationQueue setMaxConcurrentOperationCount:3];                  //同时容许几个线程在执行
    
    // 可以传递一个 NSObject 给operation的操作方法
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"value1" forKey:@"key"];
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
    NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
    NSInvocationOperation *op4 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
 
    [operationQueue addOperation:op];
    [operationQueue addOperation:op1];
    [operationQueue addOperation:op2];
    [operationQueue addOperation:op3];
    [operationQueue addOperation:op4];



// NSInvocationOperation 操作执行的方法
- (void)operationSelector:(NSDictionary *)dict
{
    // 接收传进来的dict
    NSLog(@"dictValue = %@", [dict valueForKey:@"key"]);
    sleep(2);  // 加个睡眠模仿耗时操作
    NSLog(@"currentThread = %@", [NSThread currentThread]);
    NSLog(@"mainThread = %@", [NSThread mainThread]);
}

执行结果:

从执行结果可以看出, NSInvocationOperation都是异步在子线程中执行。

总结:NSBlockOperation是优先使用主线程,NSInvocationOperation在子线程中执行。俩者都是异步执行的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值