多线程 -- NSOperation

介绍

多线程是为了不影响UI响应

封装后可以避免重复代码

NSOperationQueue:封装线程管理部分
NSOperation:封装任务部分

  • NSInvocationOperation:selector编写任务
  • NSBlockOperation:block编写任务
  • 任务可以用依赖关系串起来

NSOperation抽象基类

提供了接口。

  • 执行

    • start
    • 设置状态调用main
    • cancel
    • waitUntilFinished
  • 任务定义

  • main

  • 默认不做事

  • 会在NSOperation提供的AutoRealeasePool中执行

  • 定义NSOperation 子类时覆盖

NSInvocationOperation

创建

  • initWithTarget selector object
  • initWithInvocation
- (void)viewDidLoad {
    [super viewDidLoad];
    NSOperation *no = [[NSInvocationOperation alloc]  initWithTarget:self selector:@selector(say1) object:nil];
    [no start];
}
- (void) say1{
    for (int i=0; i<10; i++) {
        NSLog(@"%d",i);
    }
}

NSBlockOperation

创建
blockOperationWithBlock

NSOperation *bo = [NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<10; i++) {
            NSLog(@"%d",i);
        }
    } ];

追加新的Block
addExecutionBlock

[bo addExecutionBlock:^{
        NSLog(@"addExe");
    }];

这里需要注意一点,block本来是储存在栈上的,在加入NSBlockOperation后会对block进行copy,使它们存放在堆上。这时候再对原有的block进行修改也不会有影响。

   void (^xixi)(void) = ^(){
        NSLog(@"first");
    };
    NSBlockOperation *bo = [NSBlockOperation blockOperationWithBlock:xixi];
    xixi = ^(){
        NSLog(@"second");
    };
    [bo addExecutionBlock:xixi];
    
    [bo start];

NSOperation依赖关系

addDependency:dep
dep结束后 才执行
注意不要循环依赖

NSOperation 状态

.name
.ready
.asynchronous
setCompletionBlock
执行后置为nil

NSOperationQueue

Queue operations
alloc init 或者 new 创建

  • add

  • addOperation

  • addOperations

  • addOperationWithBlock(省略创建,但是不能管理dependency)

  • exec control

  • setMaxConcurrentOperationCount

  • addDependency

  • cancelAllOperation

  • setSuspended

  • waitUntilAlloperationAreFinished

如果Dep所在队列堵塞,本身所在的queue也会堵塞。
最安全是dep都在一个queue里。

mainQueue

你可能感兴趣的:(多线程 -- NSOperation)