ios中的任务分段





   工作比较忙,蛮久没有写东西了,今天我要写的是ios中的任务分段。大多数的情况下,我们用不到任务分段,但是如果我们是在执行比较频繁的函数或者这个函数是比较耗时, 某一条件下,我要执行新的任务,并且取消上次函数的执行。大家知道代码是顺序执行的,一旦开始了就无法终止,除非我们代码执行的时候做逻辑判断,在满足某一条件的时候提前 return掉这个函数,这样我们就实现了所谓的任务分段,在实际开发中是非常有用的。 

    NSOperation,为对任务分段提供了很好的支持,operation 提供一个 iscancled的标志位,表明这个opertaion对象是是不是被标识为cancel,并不是说这个operation已经cancel掉了,所以一旦我们要终止某个operation的时候,我们就告诉他我已经取消你了,你不要再往下执行了,赶紧返回吧。这个就在main 函数里面去做,是不是很简单呢?

首先我们声明一个Operation__,定义其三个分段任务,task_1,task_2,task_3.

#import <Foundation/Foundation.h>

@interface Opration__ : NSOperation


@property(nonatomic,copy)void (^task_1)(void);
@property(nonatomic,copy)void (^task_2)(void);
@property(nonatomic,copy)void (^task_3)(void);

@end


这个三个task 就是我们要执行的三个任务,只要我们对象的当前状态是isCancled ,我们就不往下执行了。


#import "Opration__.h"

static   void *oprationFinishContext =  &oprationFinishContext;
@implementation Opration__



- (void)prepareDealloc
{
    self.task_1 = nil;
    
    self.task_2 = nil;
    
    self.task_3 = nil;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    
    if ([keyPath isEqualToString:@"isFinished"])
    {
        [self prepareDealloc];
    }
}

- (id)init
{
    self = [super init];
    if (self) {
        [self addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionInitial context:oprationFinishContext];
    }
return self;
}


- (void)main
{
   
    if (self.isCancelled) {
        return;
    }
    if (self.task_1) {
        self.task_1();
    }
    if (self.isCancelled) {
        return;
    }
    if (self.task_2) {
        self.task_2();
    }

    if (self.isCancelled) {
        return;
    }
    if (self.task_3) {
        self.task_3();
    }


}
@end


     在假设大家都知道block指针和KVO的情况下,我接着往下讲,很显然我们只要在调用的时候cancel掉这个operation,main函数在执行的时候就能进行分段的执行,废话不多说,贴上代码一目了然。


#import "obj_a.h"
#import "Opration__.h"
@implementation obj_a
{
    NSOperationQueue *_queue;
}

- (void)dealloc
{
    [_queue release];
    [super dealloc];
    
}

- (id)init
{
    self = [super init];
    if (self) {
        _queue = [[NSOperationQueue alloc]init];
    }
    return self;
}
- (void)function1
{
    

    Opration__ *op = [[[Opration__ alloc]init]autorelease];
    op.task_1  = ^(void)
    {
    };
    op.task_2  = ^(void)
    {
    };
    op.task_3  = ^(void)
    {
    };
    [_queue addOperation:op];
   }

- (void)function2
{
    [_queue cancelAllOperations];
    Opration__ *op_1 = [[[Opration__ alloc]init]autorelease];
    op_1.task_1  = ^(void)
    {
    };
    op_1.task_2  = ^(void)
    {
    };
    op_1.task_3  = ^(void)
    {
    };

}


@end

   当上面的function1,fuction2顺序执行的时候,只要op还没执行结束,op的iscanceled就会为YES,这个时候我们main函数 就能分段执行了,当然你可以增加任务的个数,把任务分的更小。

  有兴趣的同学可以下载到其中的operation文件。

   

原文地址:https://www.cnblogs.com/james1207/p/3295237.html