码迷,mamicode.com
首页 > 其他好文 > 详细

step 6 NSOperation (基本演练)

时间:2016-01-01 20:58:09      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

  • NSOperation 抽象类

  • NSOperation 是一个"抽象类",不能直接使用
  • 抽象类的用处是定义子类共有的属性和方法
  • 在苹果的头文件中,有些抽象类和子类的定义是在同一个头文件中的
  • 子类:

                        NSInvocationOperation (调用)

                        NSBlockOperation (块)

NSOperationQueue 队列

基本演练

NSInvocationOperation

start

  • start 方法 会在当前线程执行 @selector 方法

- (void)opDemo1 {

    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"Invocation"];

 

    // start方法 会在当前线程执行 @selector 方法

    [op start];

}

 

- (void)downloadImage:(id)obj {

 

    NSLog(@"%@ %@", [NSThread currentThread], obj);

}

添加到队列

1  将操作添加到队列,会"异步"执行 selector 方法

- (void)opDemo2 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"queue"];

 

    [q addOperation:op];

}

添加多个操作

- (void)opDemo3 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    for (int i = 0; i < 10; ++i) {

        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@(i)];

 

        [q addOperation:op];

    }

}

执行效果:会开启多条线程,而且不是顺序执行。与GCD中并发队列&异步执行效果一样!

结论,在 NSOperation 中:

  • 操作 -> 异步执行的任务
  • 队列 -> 全局队列

NSBlockOperation

- (void)opDemo4 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"%@", [NSThread currentThread]);

    }];

 

    [q addOperation:op];

}

使用 block 来定义操作,所有的代码写在一起,更简单,便于维护!

更简单的,直接添加 Block

- (void)opDemo5 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    for (int i = 0; i < 10; ++i) {

        [q addOperationWithBlock:^{

            NSLog(@"%@ %d", [NSThread currentThread], i);

        }];

    }

}

向队列中添加不同的操作

- (void)opDemo5 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    for (int i = 0; i < 10; ++i) {

        [q addOperationWithBlock:^{

            NSLog(@"%@ %d", [NSThread currentThread], i);

        }];

    }

 

    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"block %@", [NSThread currentThread]);

    }];

    [q addOperation:op1];

 

    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];

    [q addOperation:op2];

}

  • 可以向 NSOperationQueue 中添加任意 NSOperation 的子类

线程间通讯

- (void)opDemo6 {

    NSOperationQueue *q = [[NSOperationQueue alloc] init];

 

    [q addOperationWithBlock:^{

        NSLog(@"耗时操作 %@", [NSThread currentThread]);

 

        // 主线程更新 UI

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            NSLog(@"更新 UI %@", [NSThread currentThread]);

        }];

    }];

}

step 6 NSOperation (基本演练)

标签:

原文地址:http://www.cnblogs.com/fakeCoder/p/5093709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!