iOS多线程之GCD之NSOperation && NSOperationQueue

本文介绍如何利用iOS中的GCD(Grand Central Dispatch)框架,通过NSOperation和NSOperationQueue实现多线程编程。文章详细讲解了创建任务、设置队列属性、任务依赖及任务监听等关键操作。

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

iOS多线程之GCD之NSOperation && NSOperationQueue

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
/*
 1. NSOperation的作用
 配合使用NSOperation和NSOperationQueue也能实现多线程编程
 
 2. NSOperation和NSOperationQueue实现多线程的具体步骤
 先将需要执行的操作封装到一个NSOperation对象中
 然后将NSOperation对象添加到NSOperationQueue中
 系统会自动将NSOperationQueue中的NSOperation取出来
 将取出的NSOperation封装的操作放到一条新线程中执行
 
 3. NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
 使用NSOperation子类的方式有3种
 NSInvocationOperation
 NSBlockOperation
 自定义子类继承NSOperation,实现内部相应的方法
 
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self operationQueueTest];
}


#pragma mark - NSOperationQueue

- (void)operationQueueTest
{
    // 1. 创建任务
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTest) object:nil];
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTest) object:nil];
    NSInvocationOperation *operation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTest) object:nil];
    NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{
        [self operationTest];
    }];
    
    // 2. 创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 3. 将任务加入队列
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    [queue addOperation:operation4];
    
    // 4. 设置最大并发数
    queue.maxConcurrentOperationCount = 2;
    
    // 5. 取消所有线程
    [queue cancelAllOperations];
    
    // 6.取消任务
    [operation1 cancel];
    
    // 7.暂停和恢复队列  - (BOOL)isSuspended;  // 判断队列是否暂停
    [queue setSuspended:NO];// YES代表暂停队列,NO代表恢复队列

    // 8.设置队列的优先级
    
    operation1.queuePriority = NSOperationQueuePriorityLow;
    /*
     设置NSOperation在queue中的优先级,可以改变操作的执行优先级
     - (NSOperationQueuePriority)queuePriority;
     - (void)setQueuePriority:(NSOperationQueuePriority)p;
     
     优先级的取值
     NSOperationQueuePriorityVeryLow = -8L,
     NSOperationQueuePriorityLow = -4L,
     NSOperationQueuePriorityNormal = 0,
     NSOperationQueuePriorityHigh = 4,
     NSOperationQueuePriorityVeryHigh = 8
     */
    
    // 9. 队列间的相互依赖
    [operation2 addDependency:operation1];
    
    /*NSOperation之间可以设置依赖来保证执行顺序
     比如一定要让操作A执行完后,才能执行操作B,可以这么写
     [operationB addDependency:operationA]; // 操作B依赖于操作A
     
     可以在不同queue的NSOperation之间创建依赖关系
*/
    // 10. 监听任务的完成
    // 任务完成后,回掉方法
    [operation3 setCompletionBlock:^{
        NSLog(@"operation3-%@",[NSThread currentThread]);
    }];
    
    operation4.completionBlock = ^{
        NSLog(@"operation4-%@",[NSThread currentThread]);
    };
    /*
     NSOperationQueue的作用
     NSOperation可以调用start方法来执行任务,但默认是同步执行的
     如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作
     
     添加操作到NSOperationQueue中
     - (void)addOperation:(NSOperation *)op;
     - (void)addOperationWithBlock:(void (^)(void))block;
     */
}


#pragma mark - NSBlockOperation

- (void)blockOperationTest
{
    // 1. 创建blockOperation任务
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        [self operationTest];
    }];
    
    NSBlockOperation *blockOperation2 = [[NSBlockOperation alloc] init];
    
    [blockOperation2 addExecutionBlock:^{
        [self operationTest];
    }];
    
    // 2.加入新的任务
    [blockOperation addExecutionBlock:^{
        [self operationTest];
    }];
    
    [blockOperation addExecutionBlock:^{
        [self operationTest];
    }];
    [blockOperation addExecutionBlock:^{
        [self operationTest];
    }];
    
    [blockOperation start];
    [blockOperation2 start];
    
    /* addExecutionBlock 此方法当任务大于1个时候,会自动开启线程.
     创建NSBlockOperation对象
     + (id)blockOperationWithBlock:(void (^)(void))block;
     
     通过addExecutionBlock:方法添加更多的操作
     - (void)addExecutionBlock:(void (^)(void))block;
     
     注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

     */
}

#pragma mark - NSInvocationOperation

- (void)invocationOperationTest{
    
    // 1. 创建NSInvocationOperation 任务
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTest) object:nil];
    
    // 2. 开始任务
    [operation start];
    
    /*
     注意
     默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
     只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
     */
}

- (void)operationTest
{
    NSLog(@"%@",[NSThread currentThread]);
}

@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值