//
// ViewController.m
// 05-NSOperation
//
// Created by jerry on 15/9/5.
// Copyright (c) 2015年 jerry. All rights reserved.
// /** 开发的时候看自己的需求,根据下面的各个优势, GCD---IOS4.0
- 将任务(block)添加到队列(串行/并发(全局))指定执行任务的方法(同步(阻塞)/异步)
- 拿到dispatch_get_main_queue()拿到主队列 线程之间的通信
- NSOperation无法做到的,一次性执行、延迟执行、调度组(NSOperation相对复杂) NSOperation--IOS 2.O
- 将操作(异步执行)添加到队列(并发/全局)
- [NSOperationQueue mainQueue] 主队列,任务添加到主队列,就会在主线程执行。
- 提供了一些GCD不好实现的--最大并发数
- 暂停/继续 也就是挂起操作
- 取消所有的任务
- 依赖关系
*/ /**
* 小结:
* 只要是NSOperation的一个子类就能添加到操作队列
一旦操作添加到队列,就会自动的异步执行
如果没有添加到队列中 而是使用了start方法,他会在当前线程执行操作。(一般不使用)
如果要做线程之间的痛惜你,可以使用[NSOperationQueue mainQueue]拿到主队列,往主队列添加操作更新ui
*/
#import "ViewController.h" @interface ViewController ()
// 负责调度所有的操作 全局队列
@property(nonatomic,strong)NSOperationQueue *opQueue;
@end @implementation ViewController -(NSOperationQueue *)opQueue
{
if (_opQueue==nil) {
_opQueue = [[NSOperationQueue alloc]init];
}
return _opQueue;
} - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self dependcy];
} #pragma mark -- 高级操作 // 依赖关系
- (void)dependcy
{
/**
例子:
1.下载小说的压缩包
2.解压缩 删除压缩包
3.更新ui
*/ NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1.下载小说压缩包");
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2.解压小说压缩包");
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3.删除小说压缩包");
}]; // 执行任务之间的一个依赖关系
// 指定任务之间的依赖关系--依赖关系可以跨队列(可以在子线程,到主线程更新ui)
// op2 依赖op1
[op2 addDependency:op1];
// op3 依赖op2
[op3 addDependency:op2];
// 注意点:一定不要出现循环依赖关系,
// [op1addDependency:op3]; // waitUntilFinished:类似于GCD的调度组的通知
// YES 是等待线程执行完毕,才会执行后边的代码
// no 是不会等待线程执行完毕,直接执行后边的代码
[self.opQueue addOperations:@[op1,op2] waitUntilFinished:YES]; // 在主线程更新ui
[[NSOperationQueue mainQueue] addOperation:op3];
NSLog(@"come here");
} // MARK 取消所有的队列操作 ,他是取消所有队列的操作。
- (IBAction)cancelAll {
[self.opQueue cancelAllOperations];
NSLog(@"取消所有的操作");
self.opQueue.suspended = NO;
} // 暂停操作 线程挂起。
- (IBAction)pause {
// 判断当前队列是否有操作,
if (self.opQueue.operationCount == )
NSLog(@"当前没有任何操作");
return; self.opQueue.suspended = !self.opQueue.suspended;
if (self.opQueue.suspended) {
NSLog(@"暂停");
}else
{NSLog(@"继续");} } // 最大并发数
-(void)opDemo5
{
// 设置最大并发数 默认是-1 所以 我们设置1 其实是有两条线程。
self.opQueue.maxConcurrentOperationCount = ;
for (int i = ; i < ; i++) { NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"----%@-----%d",[NSThread currentThread],i);
}];
[self.opQueue addOperation:op];
}
} #pragma mark --基本使用
/**
* 线程之间的通信
*/
-(void)opDemo4
{
// 初始化队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperationWithBlock:^{ NSLog(@"耗时操作----%@",[NSThread currentThread]);
// 在住线程更新ui
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
NSLog(@"在主线程更新ui------%@",[NSThread currentThread]);
}];
}];
} -(void)opDemo3
{
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; for (int i = ; i < ; i++) {
[queue addOperationWithBlock:^{
NSLog(@"%@---%d",[NSThread currentThread],i);
}];
}
} -(void)opDemo2
{
// 1.队列--- 相当于GCD的并发队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 主队列 -- 不会开启新线程,相当于GCD里边的主队列
// NSOperationQueue *queue = [NSOperationQueue mainQueue]; // 2.多个操作
for (int i = ; i < ; i++) {
NSBlockOperation *opBlock = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@---%d",[NSThread currentThread],i);
}];
// 把block操作放到队列里
[queue addOperation:opBlock];
} } -(void)opDemo1
{
// 1.初始化一个nsoperation
NSOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImg:) object:@"Invocation"]; // // 2.启动---他是在当前线程执行,
// [op start]; // 实际操作的时候是放到队列中进行的
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 只要把操作添加到队列,就会自动异步执行调度方法。
[queue addOperation:op];
}
-(void)downloadImg:(id)obj
{
NSLog(@"%@----%@",[NSThread currentThread],obj);
}
@end

NSOperation 代码,阐述NSOperation一般功能和重要功能的更多相关文章

  1. Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)

    接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...

  2. 让你的MyEclipse像Visual Studio 2008一样拥有强大功能智能感知功能

    Windows→Preferences→Java→Editor→Content Assist 我们看到其中的AutoActivation Delay默认值为200(单位是毫秒)也就是说在打“.”之后停 ...

  3. X5webview完美去掉分享功能和缓存功能(2)

    前段时间比较忙,没有来得及写完如何将X5WEBVIEW分享功能和缓存功能屏蔽,下面直接来干货,上代码. 1.首先在布局文件中增加一个全屏的布局, <!-- 视频全屏--> <Fram ...

  4. 系统管理模块_岗位管理_改进_使用ModelDroven方案_套用美工写好的页面效果_添加功能与修改功能使用同一个页面

    改进_使用ModelDroven方案 @Controller @Scope("prototype") public class RoleAction extends ActionS ...

  5. JeeSite功能模块解读,功能介绍,功能实现

    做为十分优秀的开源框架,JeeSite拥有着很多实用性的东西. 首先说下他的一个流程 Jeesite流程 流程 主要是jsp,entity,dao,dao.xml,service,controller ...

  6. Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能

    前言 之前写过一篇Android6.0 的屏蔽系统短信功能和来电功能,具体看这里 同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧. 屏蔽短信功能 ...

  7. WPF4.5 中的新增功能和增强功能的信息

    本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息. 本主题包含以下各节: 功能区控件 改善性能,当显示大时设置分组 ...

  8. JMessage是让App 同时集成 Push 功能与 IM 功能最完美的方案

    历经几个月的沉寂,以及兄弟们的奋战,极光推送的兄弟产品诞生了:极光IM,英文名 JMessage. 极光IM 是我们团队基于大量客户的需求反馈,在很多客户的殷切期盼下所开发的.团队成员一方面要支撑极光 ...

  9. spring boot集成websocket实现聊天功能和监控功能

    本文参考了这位兄台的文章: https://blog.csdn.net/ffj0721/article/details/82630134 项目源码url: https://github.com/zhz ...

  10. (三)微信小程序首页的分类功能和搜索功能的实现笔记

    就在昨天,微信宣布了微信小程序开发者工具新增“云开发”功能 下载最新的开发者工具,现在无需服务器即可实现小程序的快速迭代! 分类功能和搜索功能的效果图 1.首页分类功能的实现 boxtwo方法(.js ...

随机推荐

  1. LOJ117 有源汇有上下界最小流(上下界网络流)

    跑出可行流后从原来的汇点向原来的源点跑最大流,原图最小流=inf-maxflow.显然超源超汇的相关边对其也没有影响.原图最小流=可行流-原图新增流量,因为t向s流量增加相当于s向t流量减少.但为什么 ...

  2. 【Linux】自动执行Mysql常用命令脚本

    wamp环境下,我可以手敲一遍,但是lamp环境下我绝对不会手敲一遍 好吧~写脚本的确也是一遍~~~~(>_<)~~~~ 函数和后面的触发器中文档上局部是有错误的,所以大家不要一味的相信文 ...

  3. Wordpress 之删除 RSS 功能 的"文章RSS"、"评论RSS"、"WordPress.org"

    一. 去除底部“自豪地采用 WordPress”版权信息: 1.打开主题文件夹:wp-content/themes/twentyeleven/footer.php; 2.找到 这段代码 删除即可: & ...

  4. 牛客国庆集训派对Day2 H 期望

    小贝喜欢玩卡牌游戏.某个游戏体系中共有N种卡牌,其中M种是稀有的.小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝.普通卡可能多次出现,而稀有卡牌不会被重复抽到.小 ...

  5. 自学Linux Shell13.1-命令行参数

    点击返回 自学Linux命令行与Shell脚本之路 Bash shell提供了一些不同的方法来从用户处获得数据,包括以下3中方法: 命令行参数(添加在名利后面的数据) 命令行选项(可修改命令行为的单个 ...

  6. NOIP2013题解

    NOIP2013题解 Day1 转圈游戏 circle 快速幂模板题. #include<iostream> using namespace std; int n,m,k,x; int f ...

  7. SqlServer存储过程详解

    SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...

  8. [luoguU42591][小T的面试题]

    luoguU42591 题意: n个不超过n的正整数中,其中有一个数出现了两次,其余的数都只出现了一次, 求这个出现两次的数. 思路: 这个题的亮点在于内存限制1MB.明显不能再用数组储存了,肯定是用 ...

  9. Android开发属性动画

    普通动画效果和属性动画效果区别: 普通动画效果的动画播放后只是产生了视觉欺骗,并没有移动真实的控件. 属性动画直接真实的移动控件 AnimationSet动画: TextView t1 = (Text ...

  10. C语言实现KMP模式匹配算法

    next: /*! * Description: * author scictor <scictor@gmail.com> * date 2018/7/4 */ #include < ...