文档章节

Objective-c并发编程 -- NSOperation

Japer1987
 Japer1987
发布于 2017/02/02 22:42
字数 395
阅读 7
收藏 0

NSOperation 和 NSOperationQueue 实现多线程的步骤

  1. 先将需要执行的操作封装到一个NSOperationQueue对象中
  2. 将NSOperation对象添加到NSOperationQueue中
  3. 系统会自动将NSOperationQueue中的NSOperation取出来
  4. 将取出来的NSOperation封装的操作放到一条线程中去执行

NSOperation的使用

  • NSOperation 是个抽象类, 并不具备封装操作的能力, 必须使用它的子类
  • 使用NSOperation子类的方式
1. NSInvocationOperation
2. NSBlockOperation
3. 自定义子类继承自NSOperation, 实现内部相应的方法(重写main方法)

NSOperationQueue 的作用

将NSOperation添加到NSOperationQueue中,系统就会异步执行NSOperation的操作

代码演示

    // 创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 1.NSInvocationOperation 创建任务
    NSInvocationOperation *invocationOperation1 = [[NSInvocationOperation alloc] initWithTarget:self
                                                                                       selector:@selector(operation1)
                                                                                         object:nil];
    NSInvocationOperation *invocationOperation2 = [[NSInvocationOperation alloc] initWithTarget:self
                                                                                       selector:@selector(operation2)
                                                                                         object:nil];
    // 将操作放置于队列中
    [queue addOperation:invocationOperation1];
    [queue addOperation:invocationOperation2];
  
    
    // 2.NSBlockOperation 创建任务
    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"---3--- %@", [NSThread currentThread]);
    }];
    
    [blockOperation addExecutionBlock:^{
        NSLog(@"---4--- %@", [NSThread currentThread]);
    }];
    // 将操作放置于队列中
    [queue addOperation:blockOperation];
    
    
    // 3.NSOperationQueue 创建Block任务
    [queue addOperationWithBlock:^{
        NSLog(@"---5--- %@", [NSThread currentThread]);
    }];

线程通信

    [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
        // 耗时任务
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            // 主线程  刷新UI
        }];
    }];

任务依赖

 // 创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 创建任务1
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"---1--- %@", [NSThread currentThread]);
        }
    }];
    
    // 创建任务2
    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 5; i++) {
            NSLog(@"---2--- %@", [NSThread currentThread]);
        }
    }];
    
    // 创建任务3
    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"---3--- %@", [NSThread currentThread]);
    }];
    
    // 先执行后者,再执行前者    任务之间不能相互依赖
    [blockOperation1 addDependency:blockOperation2];
    
    // 将操作放置于队列中
    [queue addOperation:blockOperation1];
    [queue addOperation:blockOperation2];
    [queue addOperation:blockOperation3];

© 著作权归作者所有

Japer1987
粉丝 1
博文 40
码字总数 19747
作品 0
深圳
程序员
私信 提问
iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132
2017/12/05
0
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
Objective-C-NSOperation

NSOpseration是抽象基类,所以要用子类实现它的方法。(内部使用gcd实现) 1.一个NSOperation 就代表一个任务,任务的代码分装在block里或者函数里。 OC提供子类: NSInvocztionOperation:任...

BKF_
2016/03/03
9
0
【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。 一、NSOperation与GCD的比较 GCD是基于c的底层...

xn4545945
2014/07/28
0
0
Objective-C 后台线程 和 NSOperationQueue

后台线程 简单操作,无需创建线程时,可以使用一下函数(以UILabel 为例): [myLabel performSelector:@selector(setText:) withObject:@"hello" afterDelay:0.1f]; 代替平时的操作:[myLabe......

木木情深
2014/02/19
646
0

没有更多内容

加载失败,请刷新页面

加载更多

让《强化学习(第2版)》架起一座通往强化学习经典知识宝库的桥梁

上交大计算科学与工程系俞凯教授,5分钟口述讲解,带你快速认识了解年度重磅图书《强化学习(第二版)》! 在 AlphaGo战胜李世石之后,AlphaZero以其完全凭借自我学习超越人类在各种棋类游戏...

博文视点Bv
24分钟前
6
0
TLA7-EVM开发板的处理器、NOR FLASH、DDR3

TLA7-EVM开发板是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板+底板方式的开发板,可快速评估FPGA性能。核心板尺寸仅70mm*50mm,底板采用沉金无铅工艺的6层板设计,专业的PCB...

Tronlong创龙
32分钟前
4
0
UUID的变种-有序

为了解决UUID无序的问题,NHibernate在其主键生成方式中提供了Comb算法(combined guid/timestamp)。保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime)。 /// <summary> //...

Canaan_
33分钟前
4
0
Netty学习(6)——通道间数据传输

1. FileChannel实现通道间的数据传输 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。 transferFrom() FileChannel的transferF...

江左煤郎
36分钟前
4
0
AngularDOM操作

gtandsn
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部