美文网首页iOS线程
ios并发机制(三) —— NSOperation实现多并发之创

ios并发机制(三) —— NSOperation实现多并发之创

作者: 刀客传奇 | 来源:发表于2017-08-16 17:43 被阅读14次

    版本记录

    版本号 时间
    V1.0 2017.08.16

    前言

    信号量机制是多线程通信中的比较重要的一部分,对于NSOperation可以设置并发数,但是对于GCD就不能设置并发数了,那么就只能靠信号量机制了。接下来这几篇就会详细的说一下并发机制。感兴趣的可以看这几篇文章。
    1. ios并发机制(一) —— GCD中的信号量及几个重要函数
    2.ios并发机制(二) —— NSOperation实现多并发之创建任务

    队列的创建

    上一篇主要讲了NSOperation API接口以及创建任务的方法,下面就说一下队列的创建方法。NSOperationQueue可以分为两种队列,主队列和其他队列,其他队列里面还可以实现串行和并发功能。

    • 主队列:添加到主队列中的任务都会放在主线程中执行。
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    • 其他队列:添加到其他队列中的任务都会放在子线程中执行。
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    

    添加任务到队列

    下面我们就看一下添加任务到队列。

    方法1

    可以使用方法- (void)addOperation:(NSOperation *)op;

    下面还是看代码。

    #import "JJOperationQueueVC.h"
    
    @interface JJOperationQueueVC ()
    
    @end
    
    @implementation JJOperationQueueVC
    
    #pragma mark - Override Base Function
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        //创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        //创建任务,你也可以使用NSInvocationOperation,我这里就只用NSBlockOperation做个例子了
        NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"blockOperation");
            NSLog(@"thread = %@",[NSThread currentThread]);
        }];
        
        [queue addOperation:blockOperation];
    }
    
    @end
    

    看输出结果

    2017-08-16 17:36:13.590386+0800 JJOC[10142:4509963] blockOperation
    2017-08-16 17:36:13.590538+0800 JJOC[10142:4509963] thread = <NSThread: 0x17407ff40>{number = 4, name = (null)}
    

    可以发现开启了新的线程,同时将任务放在队列里面,任务就会立即执行,不同调用其他方法才开始执行。

    方法2

    使用- (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);

    还是直接看代码。

    #import "JJOperationQueueVC.h"
    
    @interface JJOperationQueueVC ()
    
    @end
    
    @implementation JJOperationQueueVC
    
    #pragma mark - Override Base Function
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        //创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        [queue addOperationWithBlock:^{
            NSLog(@"blockOperation");
            NSLog(@"thread = %@",[NSThread currentThread]);
        }];
    }
    
    @end
    

    下面看输出结果

    2017-08-16 17:38:32.428260+0800 JJOC[10146:4510462] blockOperation
    2017-08-16 17:38:32.428661+0800 JJOC[10146:4510462] thread = <NSThread: 0x170075a00>{number = 4, name = (null)}
    

    可见也开启了一个新的线程。

    后记

    未完,待续~~~

    相关文章

      网友评论

        本文标题:ios并发机制(三) —— NSOperation实现多并发之创

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