//
// 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. 切割模型固定写死了切平面方程是y=0.1

    上一篇讲到3d模型切割我遇到的问题(切面的纹理会混乱),经过这段时间的琢磨,有了解决方案,当然我这里只给出我的解决思路,投入到实际项目中还需要做许多工作,比如我在上一篇中切割模型固定写死了切平面方程是 ...

  2. python 和 scikit-learn 实现垃圾邮件过滤

    文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注.目前,在机器学习模型的帮助下,包括情绪分析,文件分类,话题分类,文 ...

  3. 自学Linux Shell1.2-Linux目录结构

    点击返回 自学Linux命令行与Shell脚本之路 1.2-Linux目录结构 /:  根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置 ...

  4. sql server 小技巧(1) 导入csv数据到sql server

    1. 右击 DataBaseName,选择 Tasks->Import Data 2. 选择数据源: Flat File Source , 选择一个csv文件 Advance: 选择所有的列,改 ...

  5. 洛谷 P1490 买蛋糕 解题报告

    P1490 买蛋糕 题目描述 野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕.大家不知道最后要买的蛋 ...

  6. OneProxy 管理

    -----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.168.1.1 192.168. ...

  7. python操作oracle实战

    import cx_Oracle conn = cx_Oracle.connect('ua_test/ua_test@192.32.98.15/oracledb') cur1 = conn.curso ...

  8. tesseract-ocr 识别中文扫描图片

    原文链接:http://www.cnblogs.com/alex-blog/articles/2714984.html   项目主页地址:http://code.google.com/p/tesser ...

  9. Hadoop HDFS命令

    hadoop fs -mkdir  创建HDFS目录 # hadoop fs -mkdir /data Hadoop fs -ls  列出HDFS目录 # hadoop fs -ls /data ha ...

  10. NOIP2018普及组模拟赛

    向老师给的模拟赛,还没普及组难... 题目在洛谷团队里. 第一试三道水题,我46分钟就打完了,然后就AK了. 第二试一看,除了第二题要思考一段时间之外,还是比较水的,但是我得了Rank倒1,115分. ...