多线程 NSOpeartion 的使用
NSOperation简介
相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强
NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 NSOpeationQueue 来实现多线程操作
//验证: 没有队列时, 同步执行
//子类 NSBlockOperation
//NSBlockOperation还提供了一个方法addExecutionBlock:
//额外添加 block 任务
- (void)blockOperation{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"------%@", [NSThread currentThread]);
}];
// 添加额外的任务(在子线程执行)
[op addExecutionBlock:^{
NSLog(@"2------%@", [NSThread currentThread]);
}];
[op addExecutionBlock:^{
NSLog(@"3------%@", [NSThread currentThread]);
}];
[op addExecutionBlock:^{
NSLog(@"4------%@", [NSThread currentThread]);
}];
//直接执行,没有放到 queue 中,不会开启新线程,在主线程中执行
[op start];
}
一.使用步骤:
1.创建队列
2.创建任务
3.将任务添加到队列中(异步执行, 开启新线程)
//任务 添加 到队列中
//在队列中 会 开启新线程
- (void)addTaskToQueue{
//1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 2. 创建操作
// 创建NSInvocationOperation
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
// 创建NSBlockOperation
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2-----%@", [NSThread currentThread]);
}
}];
//--添加依赖
//2 依赖1 ,则必须 1 完成之后,才会执行2
[op2 addDependency:op1];
//--设置最大并发数
// queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列
queue.maxConcurrentOperationCount = 2;
//3.将任务添加到队列中
[queue addOperation:op1];
[queue addOperation:op2];
//4.不需要创建任务,queueu直接添加 block 任务
[queue addOperationWithBlock:^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3-----%@", [NSThread currentThread]);
}
}];
}
二.特性方法
1.任务之间可以添加依赖
//--添加依赖
//2 依赖1 ,则必须 1 完成之后,才会执行2
[op2 addDependency:op1];
2.队列可以设置最大并发数
//--设置最大并发数
// queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列
queue.maxConcurrentOperationCount = 2;
三.其他方法
- (void)cancel;NSOperation提供的方法,可取消单个操作- (void)cancelAllOperations;NSOperationQueue提供的方法,可以取消队列的所有操作- (void)setSuspended:(BOOL)b;可设置任务的暂停和恢复,YES代表暂停队列,NO代表恢复队列- (BOOL)isSuspended;判断暂停状态
注意: 暂停 和 取消 并不代表可以将当前的操作 立即取消或暂停, 而是将当前的操作执行完成之后, 不再执行其他的新操作了
暂停与取消的 区别: 是否可以继续向下执行
多线程 NSOpeartion 的使用的更多相关文章
- iOS - Threads 多线程
1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...
- iOS:操作队列实现多线程NSOperation
NSOperation具体使用:直接继承NSObject 它的子类有:NSBlockOperation.NSInvocationOperation 还有一个必须的类,队列,用来装创建的线程 NSOpe ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java多线程
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
随机推荐
- python调用Go代码
Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...
- Effective ObjectiveC 2.0 Note
[Effective ObjectiveC 2.0 Note] 1.The memory for objects is always allocated in heap space and never ...
- css字体属性(font)
字体名称属性(font-family) 这个属性设定字体名称,如Arial, Tahoma, Courier等.例句如下: .s1 {font-family:Arial} 字体大小属性(fon ...
- 02-nginx信号量
刚才完了nginx的编译,nginx的编译还是挺简单的.控制nginx:重启.关闭.只有孤零零的一个二进制文件nginx 通过信号来控制它,Linux操作系统进程与进程之间通过信号来通信.荷兰的一位计 ...
- Ubuntu下libpcap安装步骤
第一步,先安装GCC ,一般都会自动安装 sudo apt-get install build-essential 第二步,GNU M4可以从此处ftp.gnu.org/gnu/m4/ 下载 sudo ...
- nodelet的理解
1.介绍 nodelet包可以为在相同进程中的多个算法之间实现零拷贝的传输方式. 这个包也提供了实现一个nodelet所需的nodelet基类以及用于实例化nodelet的NodeletLoader类 ...
- Introduction to Partial View
By Jignesh Trivedi on May 14, 2015 http://www.c-sharpcorner.com/UploadFile/ff2f08/partial-view-in-mv ...
- HDU 4081 Peach Blossom Spring (最小生成树+dfs)
题意:给定一个 n 个点和相应的权值,要求你用 n-1 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大. 析:先求出最小生成树,然后再枚举每 ...
- 不同数据库表结构的转化,PowerDesigner的使用教程
通过学习PowerDesigner工具,学习概念模型,物理模型,面向对象模型,业务模型,以及不同数据库表结构的转化. 通过案例给大家分享,sql server 2008r2 数据库和oracle数据库 ...
- angular resolve路由
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from "@angular/router&q ...