//
// 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. 自学Linux Shell12.2-test命令

    点击返回 自学Linux命令行与Shell脚本之路 12.2-test命令 if-then语句不能测试命令退出状态码之外的条件,test命令提供了在if-then语句中测试不同条件的途径. 如果tes ...

  2. html5 viewport使用

    用html5开发移动应用时往往会遇到手机的分辨率或屏幕大小不同的问题,如何使我们开发出来的应用或页面大小能适合各种手机呢?html5中的viewport能帮你做到. viewport 语法介绍: &l ...

  3. luogu4932 浏览器 (拆)

    分析1的个数的奇偶性: 奇xor奇=偶xor偶=偶 奇xor偶=奇 所以只要统计1的个数是奇数的数的个数 和 是偶数的个数 乘一起就行了 直接用bitset来做,虽然常数很小/数据随机可以过,但复杂度 ...

  4. Codeforces Round #525 (Div. 2) Solution

    A. Ehab and another construction problem Water. #include <bits/stdc++.h> using namespace std; ...

  5. idea去掉无效引用

    Mac版的idea,打开Preference->Editor->General,打勾红色框框. 然后使用快捷键 contrl + option + o 只能去掉当前文件没有引用的包,并不能 ...

  6. 在 github 新建一个文件夹

    创建新文件的时候名字后面加个斜杠(/)就可以了.

  7. iiiLab提供的视频解析接口如何使用?转发个简单的使用教程

    iiiLab除了提供免费的在线视频解析下载工具,还提供了视频解析接口供有需要的个人和公司调用. iiiLab目前已支持解析下载今日头条.西瓜视频.内涵段子.微博.秒拍.小咖秀.晃咖.火山.快手.抖音. ...

  8. Hbase记录-HBase扫描/计数/权限

    HBase扫描   scan 命令用于查看HTable数据.使用 scan 命令可以得到表中的数据.它的语法如下: scan ‘<table name>’ 下面的示例演示了如何使用scan ...

  9. JAVA记录-基础常识

    1.==与equals区别 1)==用于基本数据类型的比较,判断引用是否指向堆内存的同一地址.---引用地址 2)equals用于判断两个变量是否是对同一对象的引用,即堆中的内容是否相同,返回值为布尔 ...

  10. 四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)

    四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml) 转 ...