iOS -NSOperation——高级的并发处理方法
2024-10-09 05:33:51
NSOperation是Objective-C中一种高级的并发处理方法,现在对GCD的封装;功能比GCD更强大!
两个概念
操作;
操作队列;
NSOperation多线程实现步骤
实现多线程的步骤就是,把操作添加到操作队列中。
两个操作:NSInvocationOperation,NSBlockOperation
两个操作队列:主队列、非主队列;
队列:
队列的创建方法:
主队列:
NSOperationQueue *queue = [NSOperationQueuemainQueue];
非主队列:
NSOperationQueue *queue = [[NSOperationQueuealloc]init];
队列添加任务的方法三个
添加单个操作:
- (void)addOperation:(NSOperation
*)op;
*)op;
添加多个操作:
- (void)addOperations:(NSArray<NSOperation
*> *)ops waitUntilFinished:(BOOL)wait
NS_AVAILABLE(10_6,
4_0);
*> *)ops waitUntilFinished:(BOOL)wait
NS_AVAILABLE(10_6,
4_0);
添加block操作:
- (void)addOperationWithBlock:(void
(^)(void))block
NS_AVAILABLE(10_6,
4_0);
(^)(void))block
NS_AVAILABLE(10_6,
4_0);
操作:
NSOperation是一个抽象类,也就是说NSOperation本身不具备封装操作的能力,需要使用它的两个子类:
- NSInvocationOperation
- NSBlockOperation
操作:NSInvocationOperation
方式一、NSInvocationOperation +strat方法
1、创建NSInvocationOperation对象
- (id)initWithTarget:(id)target
selector:(SEL)selobject:(id)arg;
selector:(SEL)selobject:(id)arg;
2、调用start方法开始执行操作
- (void)start;
一旦执行操作,就会调用target的sel方法
注意:默认调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步情况下,执行操作;
方式二、NSInvocationOperation +主队列;
1、创建NSInvocationOperation对象
- (id)initWithTarget:(id)target
selector:(SEL)selobject:(id)arg;
selector:(SEL)selobject:(id)arg;
2、创建主队列
NSOperationQueue *queue = [NSOperationQueuemainQueue];
3、添加操作到主队列
- (void)addOperation:(NSOperation
*)op;
*)op;
方式三、NSInvocationOperation +非队列;
1、创建NSInvocationOperation对象
- (id)initWithTarget:(id)target
selector:(SEL)selobject:(id)arg;
selector:(SEL)selobject:(id)arg;
2、创建非主队列
NSOperationQueue
*queue = [[NSOperationQueuealloc]init];
*queue = [[NSOperationQueuealloc]init];
3、添加操作到主队列
- (void)addOperation:(NSOperation
*)op;
*)op;
操作:NSBlockOperation
方式一、NSBlockOperation +主队列
1、创建NSBlockOperation对象
NSBlockOperation *blockOp = [NSBlockOperation
blockOperationWithBlock:^{
//任务代码
}];
2、创建非主队列
NSOperationQueue *queue = [NSOperationQueue
mainQueue];
3、添加操作到主队列
[queue
addOperation:blockOp];
addOperation:blockOp];
方式二、NSBlockOperation + 非主队列
1、创建NSBlockOperation对象
NSBlockOperation *blockOp = [NSBlockOperation
blockOperationWithBlock:^{
//任务代码
}];
2、创建非主队列
NSOperationQueue *queue = [[NSOperationQueue
alloc]
init];
3、添加操作到非主队列
[queue
addOperation:blockOp];
addOperation:blockOp];
追加操作:
- (void)addExecutionBlock:(void
(^)(void))block;
(^)(void))block;
NSOperationQueue管理
1、最大并发数(同时执行的任务数)
方法:
最大并发数的相关方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
2、队列的取消、暂停、恢复
- 取消队列的所有操作
- (void)cancelAllOperations;
提示:也可以调用NSOperation的- (void)cancel方法取消单个操作
- 暂停和恢复队列
- (void)setSuspended:(BOOL)b;
// YES代表暂停队列,NO代表恢复队列
// YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended;
3、操作依赖
[operationB
addDependency:operationA];
//
操作B依赖于操作A
addDependency:operationA];
//
操作B依赖于操作A
操做依赖:——线程同步技术
[op2 addDependency op1];
不在同一个操作队列中的操作可以添加依赖!
注意:必须放在 添加操作队列之前;
忌:循环依赖;
自定义NSOperation
将操作添加到队列中的时候,会调用main方法;
- (void)main方法,在里面实现想执行的任务;
自定义NSOperation的时,只需要重写main方法即可;
最新文章
- JS常用的腳本庫--包括在線編輯器
- swun 1397 来电显示
- UESTC 1854
- flash wmode参数详解
- 一个PHP加密脚本,达到一定免杀效果
- ASP + ACCESS 上传图片到数据库与将图片读出数据库显示之实现
- postgres 数据库备份恢复
- 10位时间戳转为C#格式时间
- Java中httpClient中三种超时设置
- Codeception 实战
- bzoj4785:[ZJOI2017]树状数组:二维线段树
- windows 10安装docker一直挂起在Installing Components and Removing Files
- Clairewd’s message ekmp
- css3-盒模型display:-webkit-box;的使用
- rabbitMQ windows 安装 入门
- 进程间通信IPC-信号
- 定制库到maven库
- poj2635(千进制取模+同余模定理)
- CSS3新特性,兼容性,兼容方法总结
- MeasureSpec介绍及使用详解
热门文章
- CSS像素与绝对像素
- Redux:异步操作
- MySQL 选错索引的原因?
- js倒计时 手机休眠时 时间不进行减少
- F. Machine Learning 带修端点莫队
- poj1966枚举源汇点 求最小点割DInic
- web项目——org.apache.jasper.JasperException: /WEB-INF/content/mainForm.jsp (line: 3, column: 62) File ";/WEB-INF/c.tld"; not found
- poi--读取不同类型的excel表格
- CSS3中的rem单位
- Siemens PLC分类和基本性能指标