程序员iOS Developer我是程序员;您好程先生;叫我序员就好了

多线程基础03-NSOperation

2016-05-12  本文已影响72人  CoderMacro

阅读原文-关注我的博客


NSOperation和GCD很类似

NSOperation的作用

NSOperation和NSOperationQueue实现多线程的具体步骤

NSOperation是一个操作类它的的子类才有封装操作的能力

  1. NSInvocationOperation
  2. NSBlockOperation
  3. 自定义继承NSOperation的子类

创建NSOperation 前两种种方式其实作用一样 只是一个Block 一个target调用

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(操作的方法) object:nil];

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作
}];

队列的类型

  1. 主队列
    • [NSOperationQueue mainQueue];
    • 添加到"主队列"中的操作,都会放到主线程中执行
  2. 非主队列
    • [[NSOperationQueue alloc] init];
    • 添加到"非主队列"中的操作,都会放到子线程中执行

队列添加任务

上代码

情景一 、封装一个NSOperation操作, 直接调用start方法,

分析: 主线程 -- 同步执行 -- 不开启子线程

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作
}];
[operation start];

情景二 、封装一个NSOperation操作,往里添加多个block任务,

分析1: 第一个操作 : 主线程 -- 异步执行 -- 不开启子线程

分析2: 后添加的操作 : 子线程 -- 异步执行 -- 开启子线程

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作A
}];

[operation addExecutionBlock:^{
    // 要执行的任务或操作B
}];

[operation addExecutionBlock:^{
    // 要执行的任务或操作C
}];

[operation start];   

操作A在主线程, 操作B、C在子线程

情景三 、创建一个NSOperationQueue的队列 封装一个(或者多个)NSOperation操作

分析: 子线程 -- 异步执行 -- 开启子线程

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

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作
}];

[queue addOperation:operation];

操作是在子线程异步执行

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

// 封装
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作A
}];

NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
    // 要执行的任务或操作B
}];

[queue addOperation:operationA];
[queue addOperation:operationB];
[queue addOperationWithBlock:^{
   // 要执行的操作或任务C
}];

操作A、B、C是在子线程异步执行的

常见的用法

  1. 设置最大并发数

    • -(void)setMaxConcurrentOperationCount:(NSInteger)count;
    • (NSInteger)maxConcurrentOperationCount;
  2. 队列其它操作

    • 取消所有操作 -(void)cancelAllOperations;
    • 暂停所有操作 [queue setSuspended:YES];
    • 恢复所有操作 [queue setSuspended:NO];

操作之间的依赖

线程之间的通讯

[queue addOperationWithBlock:^{
   // 要执行耗时操作
    
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // 回到主线程执行的操作
    }];
}];
上一篇下一篇

猜你喜欢

热点阅读