NSOperation和NSOperationQueue

NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:

1> Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation

2> 自定义子类继承NSOperation,实现内部相应的方法

一.NSInvocationOperation

基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类。

  1. NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
  2. // 开始执行任务(同步执行)
  3. [operation start];

二.NSBlockOperation

能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成。NSBlockOperation比NSInvocationOperation更加灵活。

  1. NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){
  2. NSLog(@"执行了一个新的操作,线程:%@", [NSThread currentThread]);
  3. }];
  4. // 开始执行任务(这里还是同步执行)
  5. [operation start];

通过addExecutionBlock方法添加block操作

  1. NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){
  2. NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);
  3. }];
  4. [operation addExecutionBlock:^() {
  5. NSLog(@"又执行了1个新的操作,线程:%@", [NSThread currentThread]);
  6. }];
  7. // 开始执行任务
  8. [operation start];

设置操作的依赖关系:

利用 " addDependency "可以指定操作之间彼此的依赖关系(执行先后顺序),但是注意不要出现循环依赖.

设置同时并发的线程数量: [self.myQueue setMaxConcurrentOperationCount:2];

cancel和cancelAllOperations默认情况下,都不能取消已经正在执行的operation,只能取消在队列中等待的operation,如果硬要取消正在执行的,只能重写operation的main方法,并在main方法中添加对isCancel属性的监控

大多用自定义NSOperation。

时间: 2024-11-09 10:02:38

NSOperation和NSOperationQueue的相关文章

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

多线程之NSOperation和NSOperationQueue

这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOperation.是抽象类,不能够直接使用,而是使用子类NSInvocationOperation和NSBlockOperation来实际执行任务.NSOperation本身和多线程是没有任何关系的,她只是封装了一个代码段和数据去实现一个功能. 1.1.NSInvocationOperation,基于

ios多线程之NSOperation和NSOperationQueue

NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.NSOperation和NSOperationQueue实现多线程的具体步骤 2.先将需要执行的操作封装到一个NSOperation对象中 3.然后将NSOperation对象添加到NSOperationQueue中 4.系统会自动将NSOperationQueue中的NSOperation取出来 5.将取出的NSOperation封装的操作放到一条新线程中执行 NSOperat

使用NSOperation和NSOperationQueue实现多线程编程

使用NSOperation和NSOperationQueue实现多线程编程,实现步骤大致是这样的: 1> 先将需要执行的操作封装到一个NSOperation对象中 2> 然后将NSOperation对象添加到NSOperationQueue中 3> 系统会自动将NSOperation中封装的操作放到一条新线程中执行 回到顶部 一.NSInvocationOperation 1 NSInvocationOperation *operation = [[[NSInvocationOperat

Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueue) (3)Grand Central Dispath(GCD) 2,本文着重介绍Cocoa NSOperation Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上.相关的类有NSOperation和 NSOperationQueue.其中N

用NSOperation和NSOperationQueue实现多线程编程

1.上一讲简单介绍了NSThread的使用,虽然也可以实现多线程编程,但是需要我们去管理线程的生命周期,还要考虑线程同步.加锁问题,造成一些性能上的开销.我们也可以配合使用NSOperation和NSOperationQueue实现多线程编程,实现步骤大致是这样的: 1> 先将需要执行的操作封装到一个NSOperation对象中 2> 然后将NSOperation对象添加到NSOperationQueue中 3> 系统会自动将NSOperation中封装的操作放到一条新线程中执行 在此过

iOS多线程编程之NSOperation和NSOperationQueue的使用(转自容芳志专栏)

转自由http://blog.csdn.net/totogo2010/ 使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也熟悉Java,NSOperation就和java.lang.Runnable接口很相似.和Java的Runnable一样,NSOperation也是设计用来扩展的,只需继承重写NSOperation的一个方法main.相当与ja

使用NSOperation以及NSOperationQueue

NSOperation vs. Grand Central Dispatch (GCD) 在Mac OS X v10.6和iOS4之前,NSOperation 与 NSOperationQueue 不同于GCD,他们使用了完全不同的机制. 从Mac OS X v10.6和iOS4开始,NSOperation 和 NSOperationQueue是建立在GCD上的.作为一种通例,苹果推荐使用最高级别的抽象,然而当评估显示有需要时,会突然降到更低级别. 以下是对两者的快速比较,它会帮助你决定何时何地

NSOperation 和NSOperationQueue使用

示例项目的功能就是用tableview来展示经过滤镜处理的图片.图片会从网络下载,然后添加滤镜,最后展示在tableview中. 下面是应用的示意图: 初始模型 第一次尝试 下载 示例工程 . 注意:所有图片来源于 stock.xchng .一些图片有意的拼错名字,用来测试下载失败的情况. 运行工程,(最终)你会看到应用展示一列图片.试着滚动列表.很痛苦,不是吗? 所有的动作都发生在 ListViewController.swift 中,并且大多数都在 tableView(_:cellForRo

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)

(1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL); for