iOS开发NSOperation与GCD之间的关系

释放双眼,带上耳机,听听看~!

NSOperation与GCD的相同之处

1.NSOperation和NSOperationQueue实现多线程的步骤:

先将需要执行的操作封装到一个NSOperation对象中。

然后将NSOperation对象添加到NSOperationQueue中。

系统会自动将NSOperationQueue中的NSOperation取出来。

将取出的NSOperation封装的操作放到一条新线程中执行。

2.NSOperation是一个抽象,并不具封装操作的能力,必使用它的子

使用NSOperation的方式有三种:

NSInvocationOperation

NSBlockOperation

自定义子类继承NSOperation,实现内部相应的方法。

NSOperation其实就是对GCD的一个封装。

NSInvocationOperation

-(id)initWithTarget:(id) target selector:(SEL)sel object:(id) arg;

调用start方法开始执行操作

-(void)start;

一旦执行操作,就会调用target的sel方法。

注意:默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。

只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

NSBlockOperation

+(id)blockOperationWithBlock:(void (^)(void)) block;

通过addExecutionBlock:方法添加更多的操作

-(void)addExecutionBlock:(void (^)(void)) block;

注意:只要NSBlockOperation封装的操作数>1, 就会异步执行操作。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 //    [self opDemo1];
 //    [self opDemo2];
 //    [self opDemo3];
     [self opDemo4];
 }
 
 - (void)down
 {
    for (int i = 0; i < 2; i ++) {
           NSLog(@"%d", i+2);
     }
 }
 
 #pragma mark - 单个NSInvocationOperation使用
 - (void) opDemo1
 {
     NSLog(@"1");
     //创建操作
     NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
     //直接在当前线程执行(同步执行)【没有开辟线程】
     [op start];
     //放到队列gg
 //    NSOperationQueue * que = [[NSOperationQueue alloc] init];
 //    //只要把操作添加到队列,就会异步执行任务(但是任务中的任务会顺序执行)【开辟了线程】
 //    [que addOperation:op];
     NSLog(@"3");
 }
 
 - (void) opDemo2
 {
     NSLog(@"1");
     /**
      1.队列(GCD里面的并发(全局)队列使用最多),所以NSOperation技术直接把GCD里面的并发技术封装起来
     2.NSOperationQueue,本质就是GCD里面的并发队列
      3.操作是GCD里面的异步执行的任务
      **/
     NSOperationQueue * q = [[NSOperationQueue alloc] init];
     for (int i = 0; i < 2; i ++) {
         NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
         [q addOperation:op];
     }
     NSLog(@"4");
 }
 
 - (void) opDemo3
 {
     NSLog(@"1");
     //相当于GCD主队列
     NSOperationQueue * q = [NSOperationQueue mainQueue];
     //当NSOpertaion获取主线程,不会在开辟线程,但是里面的任务会在其他主线程任务执行完成后才回归执行
     for (int i = 0; i < 5; i ++) {
         
        NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
           NSLog(@"%@==========%d", [NSThread currentThread], i);
        }];
         //将block放入到队列
         //block中可以添加多个任务
         [q addOperation:op];
     }
     NSLog(@"6");
     
 }
 
 - (void) opDemo4
 {
    NSLog(@"1");
     NSOperationQueue * q = [[NSOperationQueue alloc] init];
     //block块中可以写多个任务(里面串行队列),相当于GCD中的并行串行队列
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
         NSLog(@"2");
         NSLog(@"3");
         NSLog(@"4");
     }];
     [q addOperation:op];
     //还可以在外面给队列添加任务.但是遵循fifo
     [op addExecutionBlock:^{
        NSLog(@"6");
         NSLog(@"7");
    }];
     NSLog(@"5");
 }

 

为TA充电
共{{data.count}}人
人已赞赏
iOS文章

iOS开发tableView扩展用法

2021-6-3 14:29:04

iOS文章

iOS开发沙盒缓存

2021-6-3 14:32:09

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索