iOS多线程--基础篇NSOperationQueue

本文详细介绍了iOS中NSOperation和NSOperationQueue的使用方法,包括线程创建的两种方式:NSInvocationOperation和NSBlockOperation,以及如何利用队列进行任务依赖管理和并发量控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSOperation和NSOperationQueue的使用

一、线程的创建

两种创建方式

1.使用系统提供的两种创建方式

NSInvocationOperation 和 NSBlockOperation,如果都是作为一个同步线程则基本没有区别

NSInvocationOperation :正常设置关联方法 start开始执行

NSBlockOperation :通过block块来执行,支持 addExecutionBlock 方法,通过该方法添加进去的事件均为异步执行

具体实现如下

NSInvocationOperation 的使用

NSDictionary *dic = [NSDictionary dictionaryWithObject:@"111" forKey:@"name"];
    NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(showDic:) object:dic];

[invocation start];//这样启动是主线程启动
    //放到序列自动执行 并且是用的子线程执行的
    //NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    //[queue addOperation:invocation];

NSBlockOperation 的使用

NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
        sleep(10); // 加个睡眠模仿耗时操作
        NSLog(@"currentThread = %@", [NSThread currentThread]);
        NSLog(@"mainThread = %@", [NSThread mainThread]);
    }];   
    [block addExecutionBlock:^{
        sleep(10); // 加个睡眠模仿耗时操作
        NSLog(@"二次currentThread = %@", [NSThread currentThread]);
        NSLog(@"二次mainThread = %@", [NSThread mainThread]);
    }];

    [block start];//通过addExecutionBlock添加的都将是异步子线程执行,同样可以放到队列中 自动执行并且是子线程

队列依赖使用方法 自由结合比较方便

//1.任务一:下载图片 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"下载图片 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];

//2.任务二:打水印 NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"打水印 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];

//3.任务三:上传图片 NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"上传图片 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];

//4.设置依赖 [operation2 addDependency:operation1]; //任务二依赖任务一 [operation3 addDependency:operation2]; //任务三依赖任务二

//5.创建队列并加入任务 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];

 

 

2.实现继承NSOperation类、NSOperationQueue队列

自定义NSOperation方法并且手动去管理是非常复杂的操作,需要实现startmainisExecutingisFinishedisAsynchronous等方法,并且要手动控制线程的释放、销毁等等操作。

iOS提供了一个好的NSOperationQueue队列来帮助我们实现

    //添加队列的方式 三种方式非常好用
    // 直接添加一个 NSOperation 操作,并且加入并发队列,只要当前队列允许,就会立刻执行。
    //[opQueue addOperation:]
    // 添加一组操作,如果 waitUntilFinished 为 NO,则必须在当前队列中的所有操作都执行完了,才会执行这组操作,否则立刻执行。
    //[opQueue addOperations: waitUntilFinished:YES]
    // 直接在这里写一个block,block中的操作加入并发队列,并且只要当前队列允许执行,就会立刻执行。
    //[opQueue addOperationWithBlock:^{
        
    //}];

二、 一些队列常用的属性

//总线程对象数组
    opQueue.operations
    //总线程树龄
    operationCount
    //设置最大数 add超过这个数 后续的将等待执行
    maxConcurrentOperationCount
    //取消所有
    cancelAllOperations
    //等待所有执行完成 可以做一些必须完成才执行的动作
    waitUntilAllOperationsAreFinished

三、控制并发量,线程队列设置最大并行数

[queue setMaxConcurrentOperationCount:5];

现实中真的用这个的话 系统提供的两种基本满足需要了。更多还是GCD主流

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值