NSOperation的多线程

NSOperation基于GCD的封装,使用的步骤和GCD相似,①创建队列 ②封装操作任务。

NSOperation有两种队列:

主队列:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #703daa }

NSOperationQueue *queue = [NSOperationQueue mainQueue];

自定义队列(就是并发队列):

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }

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

使用的第二步:封装操作任务

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #ba2da2 }

NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];

第三步: 将任务添加到队列中

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #3e1e81 }

[queue addOperation:op1];// 这一步内部会自动调动 [op1 start],将任务开始。

代码示例:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #ffffff; min-height: 14.0px }
span.s1 { color: #ba2da2 }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }

-(void)invocationWithQueue

{

//创建队列

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

//封装操作

NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];

NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];

NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];

//将任务添加到队列

[queue addOperation:op1];

[queue addOperation:op2];

[queue addOperation:op3];

}

封装操作任务的第二种方法:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #ba2da2 }
span.s4 { color: #31595d }

  NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #d12f1b }
span.s3 { color: #703daa }

      NSLog(@"run----%@",[NSThread currentThread]);

}];

NSBlockOperation的代码示例:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #ba2da2 }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }
span.s4 { color: #31595d }

-(void)invocationBlockWithQueue

{

//创建队列

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

//封装操作

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"1----%@",[NSThread currentThread]);

}];

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"2----%@",[NSThread currentThread]);

}];

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"3----%@",[NSThread currentThread]);

}];

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #d12f1b }

  [op1 addExecutionBlock:^{

NSLog(@"这是追加的任务");

}];

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #272ad8 }

//设置最大并发数

queue.maxConcurrentOperationCount = 1;

//将任务添加到队列

[queue addOperation:op1];

[queue addOperation:op2];

[queue addOperation:op3];

}

注意:设置最大并发数 并不能决定开几条线程,只能决定任务的执行顺序。 最大并发数不能控制追加任务的执行顺序。

设置队列暂停

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }

[self.queue setSuspended:YES]; 设置暂停 不能立即停止正在执行的任务, 只能停止正在执行操作后面的操作。当前任务不可分割,必须执行完毕。

恢复队列

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }

[self.queue setSuspended:NO];

取消所有的操作

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }

[self.queue cancelAllOperations]; 只能取消队列中处于等待状态的操作,正在执行的操作不会取消。

原文地址:https://www.cnblogs.com/dashengios/p/10420800.html

时间: 2024-11-14 22:47:12

NSOperation的多线程的相关文章

NSOperation(多线程)2

// //  ViewController.m //  UI-NO.25多线程-2 // //  Created by Bruce on 15/8/26. //  Copyright (c) 2015年 Bruce. All rights reserved. // /*  NSOperation 是一个 基类 (抽象类) 不能直接使用 必须使用他的子类  他默认是在 当前线程 进行操作   如果单独使用NSOperation 必须手动启动  常与NSOperationQueue一起使用   在与

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

iOS中的多线程 NSOperation

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation和NSOperationQueue这种方式实际上是将NSOperation的对象放到一个NSOperationQueue队列中,然后依次启动操作,类似于线程池的使用. 在使用的过程中,NSOperation的操作使用的是它的子类,分别是NSInvocationOperation和NSBlockOpe

多线程开发之二 NSOperation

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UITableViewController 4 @property (strong, nonatomic) NSArray *arrSampleName; 5 6 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName; 7 8 @end  ViewContro

iOS多线程---NSOperation介绍和使用

1.  NSOperation实现多线程编程,需要和NSOperationQueue一起使用. (1)先将要执行的操作封装到NSOperation中 (2)将NSOperation对象添加到NSOperationQueue中 (3)系统将自动将NSOPeration从NSOperationQueue中取出来,放到一个新的线程中去执行 2.NSOperation 的子类 NSOperation是一个抽象类,并没有封装操作的能力.因此要用到它的子类: (1)NSInvocationOperation

iOS多线程编程--NSOperation(转)

这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github.com/wangdachui/multithreading.git 1. NSOperation简介 NSOperation是苹果提供给我们的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更简单易用.代码可读性也更高. NSOperation需要配合NSOp

iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 系统会自动将NSOperationQueue中的NSOperation取出来 将取出的NSOperation封装的操作放到一条新线程中执行 NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类 使用NSOperation子类的方式有3种 N

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

iOS开发笔记--iOS中的多线程

摘要 本文主要介绍iOS开发中的三种多线程技术:NSThread, NSOperation/NSOperationQueue, GCD.以及在多线程编程中的注意点和小技巧. 多线程 NSThread NSOperation/NSOperationQueue GCD 目录[-] iOS中的多线程 iOS的三种多线程技术特点: GCD基本思想 队列: 操作: 不同队列中嵌套同步操作dispatch_sync的结果: 同步操作dispatch_sync的应用场景: GCD优点: GCD队列: NSOp