step 6 NSOperation (基本演练)

  • NSOperation 抽象类

  • NSOperation 是一个"抽象类",不能直接使用
  • 抽象类的用处是定义子类共有的属性和方法
  • 在苹果的头文件中,有些抽象类和子类的定义是在同一个头文件中的
  • 子类:

NSInvocationOperation (调用)

NSBlockOperation (块)

NSOperationQueue 队列

基本演练

NSInvocationOperation

start

  • start 方法 会在当前线程执行 @selector 方法

- (void)opDemo1 {

NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"Invocation"];

// start方法 会在当前线程执行 @selector 方法

[op start];

}

- (void)downloadImage:(id)obj {

NSLog(@"%@ %@", [NSThread currentThread], obj);

}

添加到队列

1  将操作添加到队列,会"异步"执行 selector 方法

- (void)opDemo2 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"queue"];

[q addOperation:op];

}

添加多个操作

- (void)opDemo3 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

for (int i = 0; i < 10; ++i) {

NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@(i)];

[q addOperation:op];

}

}

执行效果:会开启多条线程,而且不是顺序执行。与GCD中并发队列&异步执行效果一样!

结论,在 NSOperation 中:

  • 操作 -> 异步执行的任务
  • 队列 -> 全局队列

NSBlockOperation

- (void)opDemo4 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"%@", [NSThread currentThread]);

}];

[q addOperation:op];

}

使用 block 来定义操作,所有的代码写在一起,更简单,便于维护!

更简单的,直接添加 Block

- (void)opDemo5 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

for (int i = 0; i < 10; ++i) {

[q addOperationWithBlock:^{

NSLog(@"%@ %d", [NSThread currentThread], i);

}];

}

}

向队列中添加不同的操作

- (void)opDemo5 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

for (int i = 0; i < 10; ++i) {

[q addOperationWithBlock:^{

NSLog(@"%@ %d", [NSThread currentThread], i);

}];

}

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"block %@", [NSThread currentThread]);

}];

[q addOperation:op1];

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];

[q addOperation:op2];

}

  • 可以向 NSOperationQueue 中添加任意 NSOperation 的子类

线程间通讯

- (void)opDemo6 {

NSOperationQueue *q = [[NSOperationQueue alloc] init];

[q addOperationWithBlock:^{

NSLog(@"耗时操作 %@", [NSThread currentThread]);

// 主线程更新 UI

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

NSLog(@"更新 UI %@", [NSThread currentThread]);

}];

}];

}

时间: 2024-08-14 04:00:29

step 6 NSOperation (基本演练)的相关文章

step 7 NSOperation(高级/GCD对比)

高级演练 全局队列 /// 全局操作队列,统一管理所有的异步操作 @property (nonatomic, strong) NSOperationQueue *queue; - (NSOperationQueue *)queue { if (_queue == nil) { _queue = [[NSOperationQueue alloc] init]; } return _queue; } 最大并发操作数 /// MARK: - 最大并发操作数 - (void)opDemo1 { // 设

step 4 GCD 队列演练

串行队列 特点 以先进先出的方式,顺序调度队列中的任务执行 无论队列中所指定的执行任务函数是同步还是异步,都会等待前一个任务执行完成后,再调度后面的任务 队列创建 dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL); dispatch_queue_t queue = dispatch_queue_create("queueName", NULL); 串行

step 1 pthread 演练

pthread pthread 是 POSIX 多线程开发框架,由于是跨平台的 C 语言框架,在苹果的头文件中并没有详细的注释 要查阅 pthread 有关资料,可以访问 http://baike.baidu.com 导入头文件 #import <pthread.h> pthread演练 // 创建线程,并且在线程中执行 demo 函数 - (void)pthreadDemo { /** 参数: 1> 指向线程标识符的指针,C 语言中类型的结尾通常 _t/Ref,而且不需要使用 * 2&

ios多线程之NSOperation和NSOperationQueue

NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.NSOperation和NSOperationQueue实现多线程的具体步骤 2.先将需要执行的操作封装到一个NSOperation对象中 3.然后将NSOperation对象添加到NSOperationQueue中 4.系统会自动将NSOperationQueue中的NSOperation取出来 5.将取出的NSOperation封装的操作放到一条新线程中执行 NSOperat

NSOperation类

NSOperation 抽象类 NSOperation 是一个"抽象类",不能直接使用 抽象类的用处是定义子类共有的属性和方法 在苹果的头文件中,有些抽象类和子类的定义是在同一个头文件中的 子类: NSInvocationOperation (调用) NSBlockOperation (块) NSOperationQueue 队列 已经学习过的抽象类 UIGestureRecognizer CAAnimation CAPropertyAnimation 基本演练 NSInvocatio

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.

NSOperation一些总结

1-NSInvocationOperation 2-NSBlockOperation 3-NSOperationQueue管理任务 4-NSOperation任务间依赖 5-线程间通信(最重要的代码) 1-NSInvocationOperation 1.[NSInvocationOperation alloc] initWithTarget:self selector:@selector() object: 2.[q addOperation:op] // MARK: 单个NSInvocatio

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

hdu 4735 Little Wish~ lyrical step~(DLX)

题目链接:hdu 4735 Little Wish~ lyrical step~ 题意: 有n个节点的树,每个节点可能是男孩,可能是女孩,节点之间有距离,现在要让所有的女孩周围距离D之内有男孩,问最小需要交换多少次男孩和女孩的位置. 题解: 把每个节点对小于D距离的全部link起来,然后DLX爆艹,意义就是选n个节点去覆盖全部节点,如果这个节点是女生,那么就是要替换的点.然后不断更新答案. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int