zoukankan      html  css  js  c++  java
  • 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文件。

       

  • 相关阅读:
    那么这几天都是自己和工作上的事情比较零零散散
    在大家都返现的时候却有人什么都不奉献
    今天觉得自己好像比较紧张
    今天是下午有雨
    今天是星期五,上班已经三个礼拜了
    今天晚上控制电脑前,要提前开机
    其实对于家里的电脑就是硬盘不太好
    家里主要忙着建立房子
    今天装了一个RTI工具
    昨天已经开始讲业务的部分
  • 原文地址:https://www.cnblogs.com/james1207/p/3295237.html
Copyright © 2011-2022 走看看