NSOperation简单讲解
2016-04-08 12:07
211 查看
前段时间,由于公司的业务调整和整体搬迁,无奈之下我选择了离职。离职前帮公司招聘一个负责维护的iOS,问了几个前来应聘的,问到多线程这块,很多人支支吾吾说不清楚,于是自己随意写个小Demo,给大家做个借鉴。
#import "ViewController.h"
@interface
ViewController ()
@property(nonatomic,strong)
NSOperationQueue *myQueue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.myQueue=[[NSOperationQueue
alloc]
init];
[self demoOp1];
//[self demoOp2 ];
//[self demoOp3];
}
-(void)demoOp1{
// NSBlockOperation *block=[NSBlockOperation blockOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
//所有的自定义队列,都在子线程中运行
// [self.myQueue addOperation:block];
//新建线程是有开销的
//在设定同时并发的最大线程数时候,如果前一个线程工作完成,但是还没有销毁,会新建线程
//应用场景:网络开发下,下载工作!(线程开销:CPU,MEM)电量
//如果是3G,开3个子线程
//如果是WIFi,开6个子线程
[self.myQueue
setMaxConcurrentOperationCount:1];
for (int i=0; i<10; i++) {
[self.myQueue
addOperationWithBlock:^{
NSLog(@"%@",[NSThread
currentThread]);
}];
}
// [[NSOperationQueue mainQueue] addOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
}
-(void)demoOp2{
NSInvocationOperation *operation=[[NSInvocationOperation
alloc]
initWithTarget:self
selector:@selector(test:)
object:@"hahaha"];
[self.myQueue
addOperation:operation];
}
-(void)demoOp3{
NSBlockOperation *op1=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"下载图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op2=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"修饰图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op3=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"保存图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op4=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"更新UI:%@",[NSThread
currentThread]);
}];
//设定执行顺序,addDependency依赖,可能会开多个,但不会太多
//依赖关系是可以跨队列的
[op2 addDependency:op1];
[op3 addDependency:op2];
[op4 addDependency:op3];
//GCD是串行队列,异步任务,只会开一个线程
[self.myQueue
addOperation:op1];
[self.myQueue
addOperation:op2];
[self.myQueue
addOperation:op3];
//所有UI的更新都在主线程上进行
[[NSOperationQueue
mainQueue] addOperation:op4];
}
-(void)test:(id)obj{
NSLog(@"%@--%@",[NSThread
currentThread],obj);
}
@end
#import "ViewController.h"
@interface
ViewController ()
@property(nonatomic,strong)
NSOperationQueue *myQueue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.myQueue=[[NSOperationQueue
alloc]
init];
[self demoOp1];
//[self demoOp2 ];
//[self demoOp3];
}
-(void)demoOp1{
// NSBlockOperation *block=[NSBlockOperation blockOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
//所有的自定义队列,都在子线程中运行
// [self.myQueue addOperation:block];
//新建线程是有开销的
//在设定同时并发的最大线程数时候,如果前一个线程工作完成,但是还没有销毁,会新建线程
//应用场景:网络开发下,下载工作!(线程开销:CPU,MEM)电量
//如果是3G,开3个子线程
//如果是WIFi,开6个子线程
[self.myQueue
setMaxConcurrentOperationCount:1];
for (int i=0; i<10; i++) {
[self.myQueue
addOperationWithBlock:^{
NSLog(@"%@",[NSThread
currentThread]);
}];
}
// [[NSOperationQueue mainQueue] addOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
}
-(void)demoOp2{
NSInvocationOperation *operation=[[NSInvocationOperation
alloc]
initWithTarget:self
selector:@selector(test:)
object:@"hahaha"];
[self.myQueue
addOperation:operation];
}
-(void)demoOp3{
NSBlockOperation *op1=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"下载图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op2=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"修饰图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op3=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"保存图片:%@",[NSThread
currentThread]);
}];
NSBlockOperation *op4=[NSBlockOperation
blockOperationWithBlock:^{
NSLog(@"更新UI:%@",[NSThread
currentThread]);
}];
//设定执行顺序,addDependency依赖,可能会开多个,但不会太多
//依赖关系是可以跨队列的
[op2 addDependency:op1];
[op3 addDependency:op2];
[op4 addDependency:op3];
//GCD是串行队列,异步任务,只会开一个线程
[self.myQueue
addOperation:op1];
[self.myQueue
addOperation:op2];
[self.myQueue
addOperation:op3];
//所有UI的更新都在主线程上进行
[[NSOperationQueue
mainQueue] addOperation:op4];
}
-(void)test:(id)obj{
NSLog(@"%@--%@",[NSThread
currentThread],obj);
}
@end
相关文章推荐
- Nginx简易配置文件(三)(文件缓存)
- Centos查看系统硬件信息
- 如何查看apache,php,mysql的编译参数
- openstack常见错误
- linux lcd设备驱动剖析四
- linux虚拟机安装mysql(Mysql-5.7.10)
- linux lcd设备驱动剖析三
- 关注Linux防火墙之介绍iptables与ufw命令
- Auto property synthesis will not synthesize property …because it is ‘readwrite’ but it will be synth
- linux内核技术文章
- MapReduce:详解Shuffle(copy,sort,merge)过程
- Windows 与 Linux下关于端口不能访问的问题
- RESTful架构详解
- tomcat虚拟主机虚拟目录配置
- linux lcd设备驱动剖析二
- Linux远程管理器xshell和xftp使用教程
- OpenCV 图像几何变换:旋转,缩放,斜切
- linux lcd设备驱动剖析一
- linux下一步一步安装禅道项目管理工具
- The Operation couldn't be completed.(LaunchServicesError error 0.)