原文作者: Written By : Debasis Das (17-Jan-2015) 原文地址
文章会给出一些关于这一话题的代码示例.
- 什么是并发?
- 什么是NSOperationQueue
- 介绍Introduction:
- NSInvocationOperation
- NSBlockOperation
- Operation
- 什么是Dispatch Queues
- Types of Dispatch Queues
- NSOperationQueue 和 DispatchQueues的区别
- 例子
什么是并发
- 在同一时间做这不同的事
- 充分利用CPU的性能
- 平行运行多个程序
何时需要使用多线程
- 运行时需要处理复杂的逻辑, 耗时任务
- 处理独立任务,同时彼此又内联
Operations and Operation Queue
- OPeration 是 NSOperation(抽象类)的派生类
- Cocoa框架提供两个能直接使用的Operation:
- NSInvocationOperation (used to execute a method)
- NSBlockOperation (used for executing one or more blocks concurrently)
- operation要被执行必须加入 OperationQueue 队列中
NSInvocationOperation
NSInvocationOperation 不需要被 子类化, 创建NSInvocationOperation的对象之后like this :
- (NSOperation*)taskWithData:(id)data {
NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod:) object:data];
return theOp;
// This is the method that does the actual work of the task.
}
- (void)myTaskMethod:(id)data {
// Perform the task.
}
NSBlockOperation
NSBlockOperation 能添加多个Task block, 也支持直接使用:
通过addDependency可以设置队列依赖关系
NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{ NSLog(@"Beginning operation.\n"); // Do some work.
}]:
NSOperation – Writing a Custom Operation
.h
@interface KSCustomOperation : NSOperation
{
BOOL executing;
BOOL finished;
}
@property (strong) NSDictionary *mainDataDictionary;
-(id)initWithData:(id)dataDictionary;
@end
.m
@implementation KSCustomOperation
-(id)initWithData:(id)dataDictionary
{
if (self = [super init])
{
_mainDataDictionary = dataDictionary;
executing = NO;
finished = NO;
}
return self;
}
-(void)start
{
if ([self isCancelled]) { // Must move the operation to the finished state if it is canceled.
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
return;
// If the operation is not canceled, begin executing the task.
[self willChangeValueForKey:@"isExecuting"];
[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
executing = YES;
[self didChangeValueForKey:@"isExecuting"];
}
}
-(void)main
{
//This is the method that will do the work
@try {
NSLog(@"Custom Operation - Main Method isMainThread?? ANS = %@",[NSThread isMainThread]? @"YES":@"NO");
NSLog(@"Custom Operation - Main Method [NSThread currentThread] %@",[NSThread currentThread]);
NSLog(@"Custom Operation - Main Method Try Block - Do Some work here");
NSLog(@"Custom Operation - Main Method The data that was passed is %@",_mainDataDictionary);
for (int i = 0; i<5; i++)
{
NSLog(@"i%d",i);
sleep(1); //Never put sleep in production code until and unless the situation demands. A sleep is induced here to demonstrate a scenario that takes some time to complete
}
[self willChangeValueForKey:@"isExecuting"];
executing = NO;
[self didChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
}
@catch (NSException *exception) {
NSLog(@"Catch the exception %@",[exception description]);
}
@finally {
NSLog(@"Custom Operation - Main Method - Finally block");
}
}
-(BOOL)isExecuting{
return executing;
}
-(BOOL)isFinished{
return finished;
}
@end
简单说明一下, 无论是自定义的Operation还是 系统提供的 NSBlockOperation, NSInvocationOperation 当操作放入队列中开始执行的时候都是无法取消和暂停的.
只能取消和暂停还没有开始执行的队列.
DISPATCH QUEUES
- dispatch queues 允许我们同步和异步执行我们的代码块
- 所有dispatch queues 都是先进先出原则
- 任务被加入dispatch queues中并不会马上执行, 和NSOperationqueen的区别
- Dispatch Queue Types
- 串行(Serial)
- 并行(Concurrent) Global Dispatch Queue
- 主队列(Main Dispatch Queue) 主线程(串行)
我们可以通过dispatch group来管理队列之间的依赖关系