Cocoa提供了三种不同的NSOperation:
1. NSBlockOperation
Block Operations提供了利用Block 对象来执行task的方法。
2. NSInvocationOperation
3. PlainOperation
2.1 NSBlockOperation
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSBlockOperation *simpleOperation = [NSBlockOperation blockOperationWithBlock:^{ NSUInteger counter = 0;
for (counter = 0; counter < 1000;counter++){
NSLog(@"Count = %lu", (unsigned long)counter);
}
}];
[simpleOperation start];
NSLog(@"Main thread is here");
return YES;
}
NSOperationQueue *queue = [[NSOperationQueuealloc] init];
[queue addOperation:simpleOperation];
当你把一个Operation加入到queue之后,你不用手动的去start,因为queue会帮你完成,queue会管理所有加入到其中的Operation。如果你想自己控制(并不推荐这样做),你可以采用detach thread的方法。- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait
同时,可以获取queue中当前有哪些Operation以及Operation的数目:
- (NSArray *)operations;
- (NSUInteger)operationCount;
你也可以为queue设置优先级:
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
为queue添加一个便于记忆的名字:
- (void)setName:(NSString *)n ;
- (NSString *)name ;
暂停queue:
- (void)setSuspended:(BOOL)b;
- (BOOL)isSuspended;
2.2 NSInvocationOperation
这样,simpleOperation会在创建它的当前线程中(一般是main thread)执行,并且它的执行会堵塞当前线程。
NSNumber *firstNumber = [NSNumber numberWithInteger:111];
NSNumber *secondNumber = [NSNumber numberWithInteger:222];
self.firstOperation =[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(firstOperationEntry:) object:firstNumber];//first
self.secondOperation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(secondOperationEntry:) object:secondNumber];//second
self.operationQueue = [[NSOperationQueue alloc] init];
/* Add the operations to the queue */
[self.operationQueue addOperation:self.firstOperation];
[self.operationQueue addOperation:self.secondOperation];
在上面的代码里,两个Operation都在各自的线程中与main thread并行执行,而且这两个Operation之间也是并行的。在queue中可以get、set最大并行Operation数:
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
[self.secondOperation addDependency:self.firstOperation];
- (id)initWithInvocation:(NSInvocation *)inv;// designated initializer
2.3 Operation其他需要注意的点
一个Operation有相应的状态来标识它的执行过程。
- (BOOL)isCancelled;
- (BOOL)isExecuting;
- (BOOL)isFinished;
- (BOOL)isConcurrent;
- (BOOL)isReady;
通过- (void)cancel可以取消一个Operation。