工作比较忙,蛮久没有写东西了,今天我要写的是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文件。

ios中的任务分段的更多相关文章

  1. 从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray)

    从deque到std::stack,std::queue,再到iOS 中NSArray(CFArray) deque deque双端队列,分段连续空间数据结构,由中控的map(与其说map,不如说是数 ...

  2. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  3. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  4. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  5. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  6. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  7. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  8. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

  9. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

随机推荐

  1. linux如何关闭selinux?

    首先我们可以用命令来查看selinux的状态getenforce 这个命令可以查看到selinux的状态,当前可以看到是关闭状态的.还有一个命令也可以查看出selinux的状态.sestatus -v ...

  2. opencv-python 学习笔记2:实现目光跟随(又叫人脸跟随)

    如果机器人的脸能随着前方人脸而转动,你会不会觉得这种互动很有意思.年前的时候,学习了一下opencv,通过opencv可以简单的实现人脸跟随.再加上几个舵机控制头部转动,机器人就可以互动了.呵呵 这里 ...

  3. Balanced Binary Tree --Leetcode C++

    递归 左子树是否为平衡二叉树 右子树是否为平衡二叉树 左右子树高度差是否大于1,大于1,返回false 否则判断左右子树 最简单的理解方法就是如下的思路: class Solution { publi ...

  4. HDU 1501 Zipper 动态规划经典

    Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 程序中的Cookie 和Session

    这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...

  6. JavaScript 高级程序设计(第3版)笔记——chapter6:面向对象的程序设计

    一.创建对象 工厂模式.使用简单的函数创建对象,为对象添加属性和方法,然后返回对象.[问题:没有解决对象识别问题] 1 function createPerson(name, age) { 2 var ...

  7. 设计模式值六大原则——接口隔离原则 (ISP)

    接口隔离原则 Interface Segregation Principle    定义: 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 我们可以把这两个定义概括为一句话:建立 ...

  8. 关于android的坑

    坑1: 使用SQLiteOpenHelper的时候如果建立的表中存在不为空的字段,但是用ContentValues()的方式来插入数据的话恰好没有往这个字段里插入数据,那么执行后市没法往数据库里插入数 ...

  9. JDBC----数据库连接池(connection pool)

    •数据库连接池的基本思想就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再 ...

  10. jQuery(二)

    table 全选.反选.清除 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...