一、说明

NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程

NSOperation和NSOperationQueue实现多线程的具体步骤:

1.先将需要执行的操作封装到一个NSOperation对象中

2.然后将NSOperation对象添加到NSOperationQueue中

3.系统会自动将NSOperationQueue中的NSOperation取出来

4.会将封装好的NSOperation进行操作放到一天新的线程中执行

二、次要

NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类

使用方式有3种:

1.NSInvocationOperation

2.NSBlockOperation

3.自定义子类继承NSOperation,实现内部相应的方法

三、具体说明

1.NSInvocatioO

//创建操作对象,封装要执行的任务
//NSInvocationOperation 封装操作
NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];

//执行操作
[operation start];

peration子类的创建和执行操作

注意:

1.一旦执行操作,就会调用target的test方法

2.操作对象默认在主线程中执行,只有添加到队列才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行的,只是将NSOperation放到了一个NSOperationQueue中,才会异步执行操作。

//
// ViewController.m
// 01-NSOperation基本1
//
// Created by  on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//NSOperation:抽象类,不具备封装功能

//创建操作对象,封装要执行的任务
//NSInvocationOperation 封装操作
NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];

//执行操作
[operation start];

}

-(void)test
{

NSLog(@"--test--%@--",[NSThread currentThread]);
}
@end

打印结果:

2.NSBlckOperation子类创建对象和添加操作:

//创建NSBlockOperation操作对象
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//......
}];

//添加操作
[operation addExecutionBlock:^{
//....
}];

显示代码:

//
// ViewController.m
// 02-NSTherad基本2
//
// Created by  on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//创建NSBlockOperation操作对象
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
}];

//开启执行操作
[operation start];

}
@end

打印结果:

3.NSOperationQueue的作用:NSOperation可以调用start方法来执行任务,但默认是同步执行的如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作添加操作NSOperationQueue中,自动开启线程。

//创建NSOperationQueue
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
//把操作添加到队列中
//第一种方式
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
//第二种方式
[queue addOperationWithBlock:^{
NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
}];

-(void)addOperation:(NSOperation*)op;

-(void)addOperationWithBlock:(^)(void)block;

代码示例:

//
// YYViewController.m
// 03-NSOperation基本3
//
// Created by 孔医己 on 14-6-25.
// Copyright (c) 2014年 itcast. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
[super viewDidLoad];

//创建NSInvocationOperation对象,封装操作
NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
//创建对象,封装操作
NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
}];
[operation3 addExecutionBlock:^{
NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
}];

//创建NSOperationQueue
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
//把操作添加到队列中
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
}

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

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

@end

打印结果:

注意:系统会自动将NSOperationQueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务并行执行的。(队列取出是有顺序的,与打印结果并不矛盾)

转载于:https://www.cnblogs.com/jinchengvs/p/4888671.html

第一篇:NSOperation的概念相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-1(Spring左膀右臂中的左膀IOC第一篇~全是概念,Spring为啥辣么6)~整起

    我Java学的好好的,为什么要学spring框架呀[一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合]?或者说,成天喊简化开发,spring是如何简化开发的?或 ...

  2. C++11多线程第一篇:并发基本概念及实现,进程、线程基本概念

    文章目录 1.并发基本概念及实现,进程.线程基本概念 1.1 并发.进程.线程的基本概念和综述 1.1.1 并发.并行 1.1.2 可执行程序 1.1.3 进程 1.1.4 线程 1.1.5 程序.进 ...

  3. 监听器第一篇【基本概念、Servlet各个监听器】

    什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 为什么我们要使用监听器 ...

  4. CCIE理论-第一篇-SDN概念复习

    CCIE理论-第一篇-SDN概念复习 SDN-软件定义网络(Software Defined Network,SDN 最主要的核心概念是方便管理设备 传统网络 其实这个SDN也不是多牛逼的东西,他只是 ...

  5. 自己动手实现蓝牙MESH应用系列 | 第一篇:蓝牙MESH基础概念介绍

    文章目录 1. 前言 2. 概述 2.1. 蓝牙风格(Flavors) 2.2. mesh网络的动机 2.3. mesh网络中的消息传输方式 2.3.1. 以消息为中心的通信 - 发布/订阅(publ ...

  6. Webpack系列-第一篇基础杂记

    系列文章 Webpack系列-第一篇基础杂记 Webpack系列-第二篇插件机制杂记 Webpack系列-第三篇流程杂记 前言 公司的前端项目基本都是用Webpack来做工程化的,而Webpack虽然 ...

  7. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

  8. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. 国际化困境(第一篇)

    (和我前一篇文章一样,这篇文章也需要读者动手写些程序,参与其中,实验过程可能需要反复重启电脑,另外最好准备一套英文Windows系统,哦,如果再有一套Windows Vista英文版,那再好不过,总之 ...

  10. pytorch 指定卡1_[原创][深度][PyTorch] DDP系列第一篇:入门教程

    引言 DistributedDataParallel(DDP)是一个支持多机多卡.分布式训练的深度学习工程方法.PyTorch现已原生支持DDP,可以直接通过torch.distributed使用,超 ...

最新文章

  1. 经理人必须抛弃的十个习惯思维
  2. 查看Linux服务器网卡流量小脚本shell和Python各一例
  3. centos 7挂载windows共享目录
  4. boost::fibers::future用法的测试程序
  5. Boost:宏BOOST_TEST_EQ的测试
  6. Fedora 20 配置
  7. ora-01113 oracle8i,ora-01113解决办法
  8. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]
  9. c语言获取栈可用大小,[求助]求教各位大神如何获得C语言函数体的大小?
  10. Nhibernate(1)续
  11. JSONP跨域请求原理解析
  12. 切换电脑窗口的快捷键
  13. android 阻尼回弹,Android ListView实现阻尼回弹效果 并去除边缘阴影
  14. Android学习笔记:实现app启动界面跳过倒计时功能
  15. LeetCode1153 字符串转化
  16. 苹果产品中投影的秘密在这里
  17. C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用
  18. 两个分数化简比怎么化_两个分数的比化简怎么化急用
  19. javascript 正则表达式判断只能是中文、英文或者中文加英文
  20. Visual AssistX番茄助手的安装与基本使用

热门文章

  1. python 获取当前是星期几_基金定投选星期几更划算?[python统计分析]
  2. python编译exe运行慢_Python运行速度慢你知道这是为什么吗?
  3. 命令行查看图片_you-get:使用命令行工具下载网络资源,可下载 B 站视频
  4. 梅林安装opkg后安装iperf3_阳台到底有没有必要安装推拉门?利与弊告诉你,不要等安装后后悔...
  5. html编辑器后怎么使用,html在线编辑器怎么用
  6. java 对象 转换 工具类_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...
  7. java 获取手机系统_Android系统信息获取
  8. 服务器无法继续该事务 3400000006 错误原因--JAVA调用SQLSERVER存储过程时过程发生异常内部事务未
  9. mit oracle 350平衡线,MIT MI-350 CVT 平衡线_已售器材欣赏区_信谊音响_二手音响_音响发烧站_高级音响 - 音响贵族网...
  10. 2017.10.10 Perm 排列计数 失败总结