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

来源:互联网 发布:玫瑰花数 c 语言 n位数 编辑:程序博客网 时间:2024/04/29 23:59

本篇文章主要介绍下多线程下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在子线程中执行。俩者都是异步执行的。


阅读全文
0 0
原创粉丝点击