多线程之NSOperation

和GCD一样,NSOperation也是苹果提供给我们的一套多线程解决方案。实际上它也是基于GCD开发的,但是比GCD拥有更强的可控性和代码可读性。
NSOperation是一个抽象基类,基本没有什么实际使用价值。我们使用最多的是系统封装好的NSInvocationOperationNSBlockOperation

NSInvocationOperation和NSBlockOperation封装的操作都是在当前线程中调用的,有可能把主线程给卡死这两个NSOperation子类只有基于NSOperationQueue才能安全,NSOperationQueue是一个队列,它有两个创建方式

[NSOperationQueue mainQueue]
[[NSOperationQueue alloc] init]

第一个是主队列,在主线程中串行执行任务,第二个是非主队列,默认为并发队列

NSInvocationOperation与NSOperationQueue的配合使用

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download1) object:nil];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download2) object:nil];
    NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download3) object:nil];

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

    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];

NSBlockOpeartion与NSOperationQueue的配合使用

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"download1-----%@", [NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"download2-----%@", [NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"download3-----%@", [NSThread currentThread]);
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];

追加任务

[op3 addExecutionBlock:^{
        NSLog(@"download4-----%@", [NSThread currentThread]);
    }];

添加依赖,注意:不能循环依赖

[op1 addDependency:op3];
    [op3 addDependency:op2];

添加监听

op2.completionBlock = ^{
        NSLog(@"---添加监听---");
    };

当任务过多时,开启的子线程过多会消耗更多的内存资源,NSOperationQueue有一个属性maxConcurrentOperationCount,最大的并发数,能很好的控制同时并发的任务。

线程之间的通信

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        //回到主线程
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"-----%@", [NSThread currentThread]);
        }];
 }];

 

posted @ 2017-05-26 16:35  步凌香  阅读(141)  评论(0)    收藏  举报