美文网首页iOS开发
多线程 -- NSOperation

多线程 -- NSOperation

作者: 嘻嘻zhy | 来源:发表于2016-03-01 13:33 被阅读39次

    介绍

    多线程是为了不影响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

        本文链接:https://www.haomeiwen.com/subject/zsagkttx.html