//
// 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. UVA11401-Triangle Counting-递推

    给出一个数字n,计算从1到n能组成几个不同的三角形. n的范围是10^6,大概就是递推吧.从F[i-1]到F[i]可以线性求出.要注意结果超出int. #include <cstdio> ...

  2. python 模块和包

    一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...

  3. python基础成长之路四-基础数据类型方法

    1,程序开发三大流程: 顺序--从上向下,顺序执行代码 分支--根据条件判断,决定执行代码的分支 循环--让特定的代码重复执行 2,whlie循环语句: Break 某一条件满足时,退出循环,不在执行 ...

  4. HDU 6162 Ch’s gift

    Mr. Cui is working off-campus and he misses his girl friend very much. After a whole night tossing a ...

  5. (转)poj算法做题顺序

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...

  6. Python3网络爬虫(1):利用urllib进行简单的网页抓取

    1.开发环境 pycharm2017.3.3 python3.5 2.网络爬虫的定义 网络爬虫,也叫网络蜘蛛(web spider),如果把互联网比喻成一个蜘蛛网,spider就是一只在网上爬来爬去的 ...

  7. MT【35】用复数得到的两组恒等式

    特别的,当$r\rightarrow1^{-}$时有以下两个恒等式: 第二个恒等式有关的自主招生试题参考博文MT[31]傅里叶级数为背景的三角求和 评:利用两种展开形式得到一些恒等式是复数里经常出现的 ...

  8. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  9. Spark RDD操作之Map系算子

    在linux系统上安装solrCloud 1.依赖: JRE solr7.3 需要 java1.8 独立的zookeeper服务 ,zookeeper安装请参考: http://zookeeper.a ...

  10. (python爬取小故事网并写入mysql)

    前言: 这是一篇来自整理EVERNOTE的笔记所产生的小博客,实现功能主要为用广度优先算法爬取小故事网,爬满100个链接并写入mysql,虽然CS作为双学位已经修习了三年多了,但不仅理论知识一般,动手 ...