iOS多线程 - NSOperation介绍

本文详细介绍了NSOperation作为GCD封装的应用场景,包括两种主要使用方式:NSInvocationOperation和NSBlockOperation以及通过继承NSOperation来自定义类。此外还介绍了NSOperationQueue的基本使用方法,包括如何设置最大并发数及实现异步操作。

NSOperation实际是GCD的封装。
两种使用方式
1.NSInvocationOperationNSBlockOperation
2.自定义类继承NSOperation

相关概念:
1.NSOperationQueue,队列,可以认为是一个线程池。

addOperation #添加到队列
setMaxConcurrentOperationCount #设置线程池中最大变化数

2.状态

ready、cancelled、executing、finished、asynchronous

3.依赖 addDependency

    NSLog(@"主线程");

    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationAction) object:nil];
    [operation start];

    NSLog(@"end");
// 线程执行的方法
- (void)invocationAction
{
    for (int i=0; i<3; i++) {
        NSLog(@"invocationAction %d",i);
        [NSThread sleepForTimeInterval:1]; // 模拟延时
    }
}

这里写图片描述
查看控制台打印的信息:现在id都一样,同步操作,会阻塞线程。

还可以用另外一个方法,block的形式。

    NSLog(@"主线程");

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<3; i++) {
            NSLog(@"invocationAction %d",i);
            [NSThread sleepForTimeInterval:1]; // 模拟延时
        }
    }];
    [blockOperation start];

    NSLog(@"end");

这里写图片描述

上面2个方式,都是线程同步操作。
很多时候,我们更需要的是异步。

@property(nonatomic,strong)NSOperationQueue *operQueue;

然后

    NSLog(@"主线程");

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        for (int i=0; i<3; i++) {
            NSLog(@"invocationAction %d",i);
            [NSThread sleepForTimeInterval:1]; // 模拟延时
        }
    }];
    if (!self.operQueue) {
        self.operQueue = [[NSOperationQueue alloc] init];
    }
    [self.operQueue addOperation:blockOperation];


    NSLog(@"end");

这里写图片描述
这样就异步了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值