iOS线程

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

2017-08-16  本文已影响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)}

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

后记

未完,待续~~~

上一篇 下一篇

猜你喜欢

热点阅读