多线程nsoperation

不能直接使用NSOperation,而是使用系统定义的子类来完成实际任务

两个子类:NSInvocationOperation和 NSBlockOperation 他们只能执行一次任务,而且不能再次执行他,可以将它添加到一个操作队列中执行,这个可以用NSOperationQueue实现

NSOperation的创建方式,可以用定义好的两个子类创建

//第一种

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

//第二种
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        [queue setSuspended:YES];//暂停任务
        NSLog(@" op2   %@",[NSThread currentThread]);
    }];
      [op2 start];//线程开始

//第三种  :创建继承NSOperation的子类

//用子类创建的任务
    BVOperation *op3 = [[BVOperation alloc]initWithBiock:^{
        NSLog(@"op3 %@",[NSThread currentThread]);
    }];
    
//    [op3 start];

2.3 NSOperation和NSOperationQueue实现多线程的步骤:

1)先将需要执行的操作封装到一个NSOperation对象中

2)再将NSOperation对象添加到NSOperationQueue中   队列

3)系统会自动将NSOperationQueue中的NSOperation取出来

4)将取出的NSOperation封装的操作放到一条新线程中执行

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

//添加任务到任务队列
//[queue addOperation:op1];
或者初始化后添加一个数组,将需要的任务全部添加进去

// 添加多个任务到队列,bool值表示当前线程的其他任务执行完成,设置yes会导致卡死
// [queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];

//创建一个隐式添加

//    [queue addOperationWithBlock:^{
//        NSLog(@"queue block %@",[NSThread currentThread]);

//    }];

3.)NSOperation的执行顺序:

对于添加到队列中的任务,他们的执行顺序取决于两点:

1.首先看NSOperation是否已经准备好:是否准备好由对象的依赖关系确定

2.然后在根据所有的NSOperation的相对优先级确定

注意?:任务添加到队列中之后,绝对不要再修改对象的状态(各属性),因为nsoperation对象可能会在任何时候运行,所以可能会对其造成不利影响

3.1 nsoperation添加依赖关系 (不能创建循环依赖)

//添加依赖在任务添加到队列之前,但是添加依赖成功的前提是任务添加到队列中
    op1依赖op2.
//    [op1 addDependency:op2];
//    
//    [op1 addDependency:op3];

3.2 修改NSOperation的优先级 它是operation对象本身的一个属性(默认优先级为普通)

可以通过setQueuePriority:方法来提升或降低operation对象的优先级,只能应用于相同的queue中的operations。

注意:优先级不能替代依赖关系,优先级只是对准备好的operations确定执行顺序,先满足依赖关系,然后再根据优先级从准备好的操作中选择优先级高的执行。

#warning  设置最大并发数
    
  [queue setMaxConcurrentOperationCount:1];//设置最大并发数的方法(NSInteger)

#warning 取消任务,注意,已经运行的任务无法停止

//    [op2 cancel];//取消任务的方法

#warning 通过阻塞线程的方式实现同步
    
    [queue addOperation:op1];

[op1 waitUntilFinished];
    
    NSLog(@"øøøøøøøøøøøøøøøøøøøø");
    [queue addOperation:op2];
    [queue addOperation:op3];
    
 #warning 暂停和继续

暂停一个queue不会导致正在执行的operation在任务的中途暂停,可以在添加到队列之前用[queue setSuspended:YES];//暂停任务  方法

注意:一定记得让其恢复继续执行

//设置一个延时
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [queue setSuspended:NO];
    });

时间: 2024-10-09 22:20:39

多线程nsoperation的相关文章

【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的.但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装. 一.NSOperation与GCD的比较 GCD是基于c的底层api,NSOperation属于object-c类.ios首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的. GCD优点:GCD主要与block结合使用.代码简洁高效.执行效率稍微高点. NSO

多线程----NSOperation

NSOperation是Cocoa中的一个抽象类,用来封装单个任务和代码执行一项操作,由于是抽象类,所以不能直接实例化使用,必须定义子类继承该抽象类来实现, 使用NSOperation的方式有两种: 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation,有相关的使用方法. NSOperation的子类NSInvocationOperation提供了一套简单的多线程编程方法,是IOS多线程编程中最简单的一种实现方式. 另一种是继承NSOper

iOS:操作队列实现多线程NSOperation

NSOperation具体使用:直接继承NSObject 它的子类有:NSBlockOperation.NSInvocationOperation 还有一个必须的类,队列,用来装创建的线程 NSOperationQueue 理解:这个方式是如何实现多线程呢?是通过操作队列来实现多线程的.即主线程是一个主队列,再创建一个队列并将其他的线程加入其中同步执行.如果对共享资源的争夺放在主线程队列中,则不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上:否则的话,仍需要关心数据同步的问

多线程NSOperation使用方法

/*------------------------------  NSOperation使用   -----------------------------------*/ 重点:操作 NSOperation 和操作队列 NSOperationQueue! { 1.NSOperation(操作)简介: NSOperation: // 本质是对 GCD 的封装, OC 语言. NSOperation 和 GCD 的比较: GCD使用场合: 一些简单的需求,简单的多线程操作. //简单高效 NSO

四:多线程--NSOperation简单介绍

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

iOS开发——多线程OC篇&(九)多线程NSOperation介绍

NSOperation介绍 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperation取出来 (4

iOS中的多线程 NSOperation

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

IOS多线程--NSOperation\NSOperationQueue

iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术 1.GCD是纯C的,对面向对象的程序员不友好 2.GCD对编程管理还不是很强大 NSOperation 其实底层实现是基于GCD来做的 dispatch_queue_t ==  NSOperationQueue dispatch_async == NSOperation dispatch_sync  == NSOperation NSOperation是个抽象类 使用它的两个子类 NSInvocationOperat

iOS之多线程NSOperation

目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 1. 什么时候使用NSOperationQueue而不是GCD 比如你可能写过类似这样的代码(这样来请求网络数据): 1 dispatch_async(_Queue, ^{ 2 3 //请求数据 4 NSData *data = [NSData dataWit