操作和操作队列(NSOperation)

 

#import "ViewController.h"

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    // NSOperation 的使用选择:

    // 一般在开发中,直接使用 GCD 开启线程.做多线程的操作.

    // 如果 自己需要自定义框架/需要管理操作,这个时候,选择NSOperation.

    

    

    // 管理操作: 取消操作/暂停/恢复操作 ---- NSOperationQueue 可以管理.高级操作.

    

    // GCD 可以让任务按顺序执行

    // NSOperation 可以让操作按顺序执行吗? ---> 高级操作.

 

}

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    // NSOperation 两个子类

    

//    // 创建一个操作.

//    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test) object:nil];

//    

//    // 在当前线程执行. start 会在当前线程执行.直接启动

//    [op start];

    

    

    // 创建一个操作.

    // 如果 NSBlockOperation 中封装的操作数 > 1(追加操作了),这个时候,不能保证任务在哪条线程中执行.即使将操作添加到主队列,依然会有任务在子线程执行.

    // 建议:如果使用 NSBlockOperation,为了确保任务在自己想要的线程执行,最好不要追加操作.

    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

        //

        [self test];

    }];

    

    // 追加操作/任务

    [op addExecutionBlock:^{

        //

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

    }];

    

    // 追加操作/任务

    [op addExecutionBlock:^{

        //

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

    }];

    

    

    // 追加操作/任务

    [op addExecutionBlock:^{

        //

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

    }];

    

    // 追加操作/任务

    [op addExecutionBlock:^{

        //

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

    }];

    

    // 直接启动操作

   // [op start];

    

    

    // NSOperation中的队列 -----> 操作队列 :管理/执行操作. 两种:

    

    // 1.主队列:主队列中的操作,都要交给主线程执行.

//    

    // 获取主队列

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

    

    // 将操作添加到队列中

    [mainQueue addOperation:op];

    

    // 2.非主队列.添加到非主队列中的操作,都交给子线程来执行.

    

//    // 创建一个非主队列

//    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//    

//    // 将操作添加到非主队列中

//    [queue addOperation:op];

    

    

    // 这一句代码,相当于之前的两句.

    [mainQueue addOperationWithBlock:^{

        //

        NSLog(@"直接往操作队列中添加操作%@",[NSThread currentThread]);

    }];

    

    

}

 

 

 

-(void)test

{

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

}

 

 

@end

posted @ 2015-09-05 00:22  记忆里的那座沙城  阅读(211)  评论(0编辑  收藏  举报