多线程编程 - NSOperationQueue

2016-10-24  本文已影响0人  N最珍贵

一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。也可以将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。

创建一个操作队列:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];  

添加NSOperation到NSOperationQueue中

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);

}];

[queue addOperation:operation1];

[queue addOperationWithBlock:^() {

NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]); 

}]; 

NSOperation添加到queue之后,通常短时间内就会得到运行。但是如果存在依赖,或者整个queue被暂停等原因,也可能需要等待。

注意:NSOperation添加到queue之后,绝对不要再修改NSOperation对象的状态。因为NSOperation对象可能会在任何时候运行,因此改变NSOperation对象的依赖或数据会产生不利的影响。你只能查看NSOperation对象的状态, 比如是否正在运行、等待运行、已经完成等

添加NSOperation的依赖对象

1.当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。另外,通过removeDependency方法来删除依赖对象。

[operation2 addDependency:operation1];

设置队列的最大并发操作数量

// 每次只能执行两个操作

queue.maxConcurrentOperationCount = 2;

取消Operations

// 取消单个操作

[operation cancel];

// 取消queue中所有的操作

[queue cancelAllOperations];

等待Options完成

// 会阻塞当前线程,等到某个operation执行完毕

[operation waitUntilFinished];

// 阻塞当前线程,等待queue的所有操作执行完毕

[queue waitUntilAllOperationsAreFinished];

暂停和继续queue

// 暂停queue

[queue setSuspended:YES];

// 继续queue

[queue setSuspended:NO];

上一篇 下一篇

猜你喜欢

热点阅读