iOS开发-多线程NSOperation和NSOperationQueue
上一篇文章稍微提及了一下NSThread的使用,NSThread能直观地控制线程对象,不过需要自己管理线程的生命周期,线程同步,用起来比较繁琐,而且比较容易出错。不过Apple给出了自己的解决方案NSOperation,它本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有NSInvocationOperation和NSBlockOperation两种方式,先补充一下NSThread的用法:
NSThread获取当前线程:
[NSThread currentThread]
performSelectorInBackground可以更新UI,不建议使用:
- (IBAction)update:(id)sender { [self performSelectorInBackground:@selector(changeImage) withObject:nil]; }
图片背景更新:
-(void)changeImage{
NSLog(@"线程执行完之后更新图片");
self.myImageView.image=[UIImage imageNamed:[NSString stringWithFormat:@"Thread2.jpg"]];
}
NSInvocationOperation和NSBlockOperation
这两种方式都很简单,其中NSInvocation的调用方式类似于NSThread,NSBlockOperation如果对Block有一点了解就可以,如果不明白的可以参考本人之前的Block文章 Object-C-代码块Block回顾,那么接下来的使用方式就很简单:
先来看下NSInvocationOperation的实例化方式:
//初始化
NSInvocationOperation *myInvocationOperation= [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTaskMethod) object:nil];
//启动
[myInvocationOperation start];
调用方法:
-(void)operationTaskMethod{
NSLog(@"NSInvocationOperation初始化执行"); }
NSBlockOperation的方式:
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"BlockOperation块执行");
}];
[blockOperation start];
两种方式很方便,这个时候可以使用NSOperationQueue作为一个队列将线程包含在一起,首先定义一个NSOperationQuene:
@property (strong,nonatomic) NSOperationQueue *myOperationQuene;
这个时候需要调用:
NSInvocationOperation *myInvocationOperation= [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationTaskMethod) object:nil]; NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"BlockOperation块执行");
}]; self.myOperationQuene=[[NSOperationQueue alloc]init]; [self.myOperationQuene addOperation:myInvocationOperation]; [self.myOperationQuene addOperation:blockOperation];
上面最后的结果不确定,线程执行的顺序没法确定,如果想确定的按照顺序执行,需要添加一个依赖:
[blockOperation addDependency:myInvocationOperation];
添加依赖之后的,每次输出的结果一定是这样的:
2015-02-11 07:56:13.457 ThreadDemo[657:15033] NSInvocationOperation初始化执行
2015-02-11 07:56:13.457 ThreadDemo[657:15034] BlockOperation块执行
自定义NSOperation
每次一看到自定义,就感觉瞬间有了档次,然后参考一下前人的经验,不过网上的博客有的不好说,那感觉就是我想吃一个鸡腿,却拿到了一个鸡腿堡,需要的不需要的都要自己一起吸收。NSInvocationOperation和NSBlockOperation这两种方式不能满足业务需求,这个时候需要自定义的NSOperation,自定义的有两种分为非并发(NonConcurrent)和并发(Concurrent)两种形式,本文介绍非并发形式。
新建一个继承自NSOperation的MyCustomOperation,然后实现一下main方法:
//
// MyCustomOperation.h
// ThreadDemo
//
// Created by keso on 15/2/11.
// Copyright (c) 2015年 keso. All rights reserved.
// #import <Foundation/Foundation.h> @interface MyCustomOperation : NSOperation @property (strong,nonatomic) NSString *customdata; -(void)initData:(NSString *)data; @end
NSOperation对象需要定期地调用isCancelled方法检测操作是否已经被取消,如果返回YES(表示已取消),则立即退出执行回收内存资源。所有NSOperation子类,一般用于代码比较容易终止的地方, 在循环的每次迭代过程中,如果每个迭代相对较长可能需要调用多次和没有执行工作之前调用。
//
// MyCustomOperation.m
// ThreadDemo
//
// Created by keso on 15/2/10.
// Copyright (c) 2015年 keso. All rights reserved.
// #import "MyCustomOperation.h" @implementation MyCustomOperation - (void)initData:(NSString *)data{
if (self ==[super init])
_customdata= data;
}
- (void)main {
@try {
BOOL isDone = NO;
NSLog(@"循环之前的调用");
while (![self isCancelled] && !isDone) {
// Do some work and set isDone to YES when finished
NSLog(@"已经运行成功了");
isDone=YES;
}
}
@catch(...) {
NSLog(@"出现异常,请检查代码~");
}
} @end
如果需要调用定义的NSOPeration实例化之后Start即可:
MyCustomOperation *customOperation=[[MyCustomOperation alloc] init];
[customOperation start];
参考资料:https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW6
iOS开发-多线程NSOperation和NSOperationQueue的更多相关文章
- iOS 开发多线程 —— NSOperation
本文是根据文顶顶老师的博客学习而来,转载地址:http://www.cnblogs.com/wendingding/p/3809042.html 一.NSOperation简介 1.简单说明 NSOp ...
- ios开发多线程二:NSOperationQueue的基本使用
#import "ViewController.h" #import "XMGOperation.h" @interface ViewController () ...
- iOS开发多线程篇—NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发多线程篇—NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发多线程篇—自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇 09 —NSOperation简单介绍
iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...
- iOS开发多线程篇 11 —自定义NSOperation
iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
随机推荐
- CSU - 2055 Wells‘s Lottery
Description As is known to all, Wells is impoverished. When God heard that, God decide to help the p ...
- 二、redis系列之持久化
1. 绪言 redis是一种内存数据库,它把数据存储在服务器的内存当中,这样极大地保证了redis数据库的性能,但也为数据安全带来了隐患——redis所在服务器重启或者发生宕机后,redis数据库里的 ...
- Java中面向对象的理解
按照惯例,先做一个简单的介绍,现在开始学习 Thinging in Java 4 ,一边看,一边记录,我都不想给自己设定时间安排了,毕竟很少实现过.所以就这样吧!不定期的更新,我都会放到博客中的. 所 ...
- JAVAEE——宜立方商城04:图片服务器FastDFS、富文本编辑器KindEditor、商品添加功能完成
1. 学习计划 1.图片上传 a) 图片服务器FastDFS b) 图片上传功能实现 2.富文本编辑器的使用KindEditor 3.商品添加功能完成 2. 图片服务器的安装 1.存储空间可扩展. 2 ...
- BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序
https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...
- 【20181102T1】优美的序列【二分+ST表】
题面 [正解] 相当于是 \(GCD_{i=L}^{R} A_i = min_{i=L}^{R} \{A_i\}\) 然后GCD可以用ST表实现\(O(log A_i)\)查询 并且GCD是递减的,所 ...
- Vue-router浅析(二)
一.导航守卫 经常在项目中,会对页面做一些权限控制,所以需要对路由变化做出处理,跳转或取消相应的路由. 导航:即路由发生变化.导航守卫即对路由变化做出处理.当然也分几种情况:对全局变化做处理.对&qu ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx Solved: 2xx 题目连接 http:/ ...
- Codechef December Challenge 2014 Chef and Apple Trees 水题
Chef and Apple Trees Chef loves to prepare delicious dishes. This time, Chef has decided to prepare ...
- wikioi 1294 全排列 dfs
1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个n, 请输出n的所有全排列 输入描述 Inpu ...