//
// 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. TP5报错总结

    LNMP一键安装包上部署TP5项目500错误或者空白解决 [问题原因] TP5的入口文件在public下,当他调用类文件时,跨目录所以造成500错误,或者一片空白的问题 [解决方法] 1.public ...

  2. CF-Contest339-614

    614A-Link/Cut Tree 比较水,注意64位int仍然可能溢出. #include <cstdio> #include <algorithm> #include & ...

  3. Codeforces Round #420 (Div. 2) A,B,C

    A. Okabe and Future Gadget Laboratory time limit per test 2 seconds memory limit per test 256 megaby ...

  4. 删除linux下的指定文件

    要求:删除linux下2天前的指定文件 find 文件问题:在 tmp 目录下有大量包含 picture_* 的临时文件,每天晚上 2:00 对一天前的文件进行清理.之前在 crontab 下跑如下脚 ...

  5. 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批量部署必备)

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批 ...

  6. LeetCode好题汇总

    最近开始刷LeetCode,准备按照专题来进行.所有的解题方案我都会放在GitHub上面,对于有价值的题目,我会重新在这里做记录,并且将解题方案贴出来,便于自己之后复习. Array 1. easy ...

  7. 洛谷 P3705 [SDOI2017]新生舞会 解题报告

    P3705 [SDOI2017]新生舞会 题目描述 学校组织了一次新生舞会,\(Cathy\)作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个 ...

  8. 大公司面试经典数据结构与算法题C#/Java解答

    几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表 ...

  9. Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭

    AlertDialog.Builder builder = new Builder(this); builder.create().show(); 这样显示出来的对话框,当用户按返回键或搜索键时,这个 ...

  10. Mac挂载虚拟机的共享文件夹

    说明:sshfs可以帮助本地mac访问虚拟机上的共享文件夹,从而操作虚拟机上的文件夹非常方便 1.安装sshfs sudo port install sshfs 2.使用,指定远程目录,到本地某一目录 ...