NSOperation

2018-02-11  本文已影响15人  Carson_Zhu

简介

NSOperation是苹果提供给我们的一套多线程解决方案。实际上NSOperation是基于GCD更高一层的封装,但是比GCD更简单易用、代码可读性也更高。

GCD和NSOperation区别

NSOperation使用步骤

NSOperation单独使用时系统同步执行操作,并没有开辟新线程的能力,只有配合NSOperationQueue才能实现异步执行。

1. 创建任务
2. 创建队列

NSOperationQueue一共有两种队列:主队列其他队列。其中其他队列同时包含了串行、并发功能。下边是主队列、其他队列的基本创建方法和特点。

3. 将任务加入到队列中
串行执行和并发执行

之前我们说过,NSOperationQueue创建的其他队列同时具有串行、并发功能,那么怎么去设置串行和并发呢?通过设置最大并发数maxConcurrentOperationCount来实现串行和并发。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
    
[queue addOperationWithBlock:^{
    NSLog(@"thread 1 : %@", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
    NSLog(@"thread 2 : %@", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
    NSLog(@"thread 3 : %@", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
    NSLog(@"thread 4 : %@", [NSThread currentThread]);
}];
[queue addOperationWithBlock:^{
    NSLog(@"thread 5 : %@", [NSThread currentThread]);
}];

打印结果:

2018-02-11 19:17:03.033446+0800 ThreadDemo[2148:190380] thread 1 : <NSThread: 0x60400027e980>{number = 4, name = (null)}
2018-02-11 19:17:03.033766+0800 ThreadDemo[2148:190380] thread 2 : <NSThread: 0x60400027e980>{number = 4, name = (null)}
2018-02-11 19:17:03.034790+0800 ThreadDemo[2148:190380] thread 3 : <NSThread: 0x60400027e980>{number = 4, name = (null)}
2018-02-11 19:17:03.035108+0800 ThreadDemo[2148:190380] thread 4 : <NSThread: 0x60400027e980>{number = 4, name = (null)}
2018-02-11 19:17:03.036011+0800 ThreadDemo[2148:190380] thread 5 : <NSThread: 0x60400027e980>{number = 4, name = (null)}
queue.maxConcurrentOperationCount = 2;

打印结果:

2018-02-11 19:20:45.667381+0800 ThreadDemo[2211:197053] thread 2 : <NSThread: 0x60400047ae40>{number = 5, name = (null)}
2018-02-11 19:20:45.667436+0800 ThreadDemo[2211:197054] thread 1 : <NSThread: 0x60000026ca40>{number = 4, name = (null)}
2018-02-11 19:20:45.667700+0800 ThreadDemo[2211:197054] thread 4 : <NSThread: 0x60000026ca40>{number = 4, name = (null)}
2018-02-11 19:20:45.667705+0800 ThreadDemo[2211:197055] thread 3 : <NSThread: 0x60000026d0c0>{number = 6, name = (null)}
2018-02-11 19:20:45.668231+0800 ThreadDemo[2211:197054] thread 5 : <NSThread: 0x60000026ca40>{number = 4, name = (null)}

结论:
当最大并发数为1时,任务是按顺序串行执行的。
当最大并发数为2时,任务是并发执行的。而且开启线程数量是由系统决定的,不需要我们来管理。这样看来,是不是比GCD还要简单了许多?

操作依赖

NSOperationNSOperationQueue最吸引人的地方是它能添加操作之间的依赖关系。比如说有A、B两个操作,其中A执行完操作,B才能执行操作,那么就需要让B依赖于A。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"thread 1 : %@", [NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"thread 2 : %@", [NSThread currentThread]);
}];
// op1依赖op2完成才执行
[op1 addDependency:op2];
    
[queue addOperation:op1];
[queue addOperation:op2];

打印结果:

2018-02-11 19:58:01.051917+0800 ThreadDemo[2505:220669] thread 2 : <NSThread: 0x60000027f600>{number = 4, name = (null)}
2018-02-11 19:58:01.052233+0800 ThreadDemo[2505:220670] thread 1 : <NSThread: 0x604000473140>{number = 5, name = (null)}

注意:
依赖关系可以跨队列,NSOperation之间的相互依赖会导致死锁。

其他方法
上一篇 下一篇

猜你喜欢

热点阅读