多线程编程 - NSOperationQueue

一个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];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 614评论 0 0
  • iOS Concurrency Programming Guide iOS 和 Mac OS 传统的并发编程模型是...
    YangPu阅读 857评论 0 2
  • 原文链接:http://www.cocoachina.com/ios/20150807/12911.html 现如...
    Kevin追梦先生阅读 1,488评论 0 3
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 1,777评论 0 17
  • 首先明确线程和进程的关系和区别: 一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多...
    kkj1996阅读 213评论 0 0