oc中的blocks的功能,一种比代理简洁的方式

blocks方式:

谁要东西谁就要写blocks,通过blocks(返回值)获取想要的,提供东西的人要通过实现函数指针把东西给想要的人.当然也可以传值,传值需要通过形参.

block的功能:

block功能就是通过一个方法的返回值来获取其他类中的内容,或者设置其他类中的值, 总的来说就是操作其他类,其他类调用block时,可以具有一些灵活性,但是必须符合方法规范(即block定义的方法的形式).

上面是个人对blocks的理解;接下来是自己写的一个简单的例子模拟,卖方-快递-买方,之间的交互,大体结构是:卖方通过blocks将货物交给快递,快递将货物送到客户手中客户将钱给快递员.

/**********************************************************************************************/

/**********************************************************************************************/

首先是main.m文件

//买方向卖方提交商品信息

Buyer *buyer1=[[Buyer alloc] init];

[buyer1 setGoods:@"apple1"];

[buyer1 setName:@"buyer1"];

Buyer *buyer2=[[Buyer alloc] init];

[buyer2 setGoods:@"apple2"];

[buyer2 setName:@"buyer2"];

Buyer *buyer3=[[Buyer alloc] init];

[buyer3 setGoods:@"apple3"];

[buyer3 setName:@"buyer3"];

Buyer *buyer4=[[Buyer alloc] init];

[buyer4 setGoods:@"apple4"];

[buyer4 setName:@"buyer4"];

NSArray *[email protected][[buyer1 goods],[buyer2 goods],[buyer3 goods],[buyer4 goods]];

//买方规定价钱

Seller *seller=[[Seller alloc] init];

[seller setGoods:[buyer1 goods]];

[seller setBuyerName:[buyer1 name]];

[seller setMoney:@"12"];

[seller setGoods:[buyer2 goods]];

[seller setBuyerName:[buyer2 name]];

[seller setMoney:@"34"];

[seller setGoods:[buyer3 goods]];

[seller setBuyerName:[buyer3 name]];

[seller setMoney:@"135"];

[seller setGoods:[buyer4 goods]];

[seller setBuyerName:[buyer4 name]];

[seller setMoney:@"543"];

//将价格和商品存入数组发送给快递

NSArray *arrBuyer=[[NSArray alloc] initWithArray:[seller buyerName]];

NSArray *arrMoney=[[NSArray alloc] initWithArray:[seller money]];

Poster *poster=[[Poster alloc] init];

[poster setBuyerList:arrBuyer];

[poster setGoodsList:arrGoods];

[poster setGoodsMoney:arrMoney];

[seller setSeller:poster];

//快递把商品交给买方

[poster setPoster:buyer1];

sleep(1);

[poster setPoster:buyer2];

sleep(1);

[poster setPoster:buyer3];

sleep(1);

[poster setPoster:buyer4];

sleep(1);

接下来是各个类的具体实现:

/**********************************************************************************************/

Seller.h

/**********************************************************************************************/

#import <Foundation/Foundation.h>

#import "Poster.h"

@interface Seller : NSObject

{

Poster *_poster;

NSMutableArray *_buyername;    //保存买方的姓名

NSMutableArray *_goods;           //保存买方的商品

NSMutableArray *_money;          //保存买方的商品价格

}

-(void)setBuyerName:(NSString *)name;

-(NSMutableArray *)buyerName;

-(void)setGoods:(NSString *)goods1;

-(NSMutableArray *)goods;

-(void)setMoney:(NSString *)money1;

-(NSMutableArray *)money;

-(void)setSeller:(Poster *)poster;      //回调方法,将送货单(姓名,商品,价格)传给快递

@end

/**********************************************************************************************/

Seller.m

/**********************************************************************************************/

#import "Seller.h"

@implementation Seller

-(id)init

{

if(self=[super init])

{

_buyername = [[NSMutableArray alloc] init];

_goods=[[NSMutableArray alloc] init];

_money=[[NSMutableArray alloc] init];

}

return self;

}

-(void)setBuyerName:(NSString *)name

{

[_buyername addObject:name];

}

-(NSMutableArray *)buyerName

{

return _buyername;

}

-(void)setGoods:(NSString *)goods1

{

[_goods addObject:goods1];

}

-(NSMutableArray *)goods

{

return _goods;

}

-(void)setMoney:(NSString *)money1

{

[_money addObject:money1];

}

-(NSMutableArray *)money

{

return _money;

}

//调用Poster中的方法,让poster回调Seller获取要送的东西(包含价格和商品,还有顾客信息)

-(void)setSeller:(Poster *)poster

{

[poster sendGoods:^NSMutableArray *(void) {

NSMutableArray *dic=[[NSMutableArray alloc] init];

[dic addObject:_buyername];

[dic addObject:_goods];

[dic addObject:_money];

NSLog(@"\n卖家把货单给了快递\n货单如下:");

NSMutableString *ms=[[NSMutableString alloc] init];

for(int i=0;i<[[dic objectAtIndex:0] count];i++)

{

[ms appendFormat:@"\n"];

for(int j=0;j<[dic count];j++)

{

[ms appendFormat:@"%@ ",[[dic objectAtIndex:j] objectAtIndex:i]];

}

}

NSLog(@"%@",ms);

return dic;

}];

}

@end

/**********************************************************************************************/

Poster.h

/**********************************************************************************************/

#import <Foundation/Foundation.h>

#import "Buyer.h"

@interface Poster : NSObject

{

Buyer *_buyer;

NSMutableArray *_buyerList;    //保存买方的姓名

NSMutableArray *_goodsList;    //保存买方的商品

NSMutableArray *_goodsMoney;   //保存买方的商品价格

}

-(void)setBuyerList:(NSArray *)buyerList;

-(NSMutableArray *)buyList;

-(void)setGoodsList:(NSArray *)goods;

-(NSMutableArray *)goodsList;

-(void)setGoodsMoney:(NSArray *)money;

-(NSMutableArray *)goodsMoney;

-(void)sendGoods:(NSMutableArray *(^)(void))eachSend;    //建立blocks,供外界访问

-(void)setPoster:(Buyer *)buyer;    //回调方法,传送商品和价格信息

@end

/**********************************************************************************************/

Poster.m

/**********************************************************************************************/

#import "Poster.h"

@implementation Poster

-(id)init

{

if(self =[super init])

{

_goodsList=[[NSMutableArray alloc] init];

_goodsMoney=[[NSMutableArray alloc] init];

}

return self;

}

-(void)setBuyerList:(NSMutableArray *)buyerList

{

_buyerList=buyerList;

}

-(NSMutableArray *)buyList

{

return _buyerList;

}

-(void)setGoodsList:(NSMutableArray *)goods

{

_goodsList = goods;

}

-(NSMutableArray *)goodsList

{

return _goodsList;

}

-(void)setGoodsMoney:(NSMutableArray *)money

{

_goodsMoney = money;

}

-(NSMutableArray *)goodsMoney

{

return _goodsMoney;

}

//调用buyer中的方法,让buyer回调poster获取要给的钱数

-(void)setPoster:(Buyer *)buyer

{

static int i=-1;

_buyer = buyer;

[buyer reciveGoods:^NSString *(void) {

i++;

return [[NSString alloc]initWithFormat:@"%@ %@",[_goodsMoney objectAtIndex:i],[_goodsList objectAtIndex:i]];

}];

}

//回调Seller类中获取货物发送给顾客

-(void)sendGoods:(NSMutableArray *(^)(void))eachSend

{

NSMutableArray *mArr=[[NSMutableArray alloc]initWithArray:eachSend()];

NSArray *buyerArray=[mArr objectAtIndex:0];

NSArray *goodsArray=[mArr objectAtIndex:1];

NSArray *moneyArray=[mArr objectAtIndex:2];

_buyerList=[[NSMutableArray alloc] initWithArray: buyerArray];

_goodsMoney=[[NSMutableArray alloc] initWithArray: moneyArray];

_goodsList=[[NSMutableArray alloc] initWithArray:goodsArray];

//    //postBlocks=[afterEachSend copy];

for(int i=0;i<[[mArr objectAtIndex:1] count];i++)

{

NSLog(@"货物%@已经发出.",[goodsArray objectAtIndex:i]);  //快递发送完商品后返回商品名给商家

sleep(1);

}

}

@end

Buyer.h

#import <Foundation/Foundation.h>

@interface Buyer : NSObject

@property (nonatomic,copy) NSString *name;                     //保存用户姓名

@property (nonatomic,copy) NSString *goods;                     //保存购买的商品

-(void)reciveGoods:(NSString *(^)(void))afterEachRecive;    //建立blocks,供外界访问

@end

/**********************************************************************************************/

Buyer.m

/**********************************************************************************************/

#import "Buyer.h"

@implementation Buyer

-(id)init

{

if(self=[super init])

{

[email protected]"";

[email protected]"";

}

return self;

}

//Buyer回调Poster获取要给的钱数

-(void)reciveGoods:(NSString *(^)(void))afterEachRecive

{

NSArray *arr=[afterEachRecive() componentsSeparatedByString:@" "];

NSLog(@"%@收到商品后,为%@支付了%@",[self name], arr[1], arr[0]);//买家接收商品后返回钱

}

@end

/**********************************************************************************************/

代码运行结果

/**********************************************************************************************/

2015-08-16 21:19:46.276 Asignment_1[758:24272]

卖家把货单给了快递

货单如下:

2015-08-16 21:19:46.316 Asignment_1[758:24272]

buyer1 apple1 12

buyer2 apple2 34

buyer3 apple3 135

buyer4 apple4 543

2015-08-16 21:19:46.316 Asignment_1[758:24272] 货物apple1已经发出.

2015-08-16 21:19:47.321 Asignment_1[758:24272] 货物apple2已经发出.

2015-08-16 21:19:48.324 Asignment_1[758:24272] 货物apple3已经发出.

2015-08-16 21:19:49.327 Asignment_1[758:24272] 货物apple4已经发出.

2015-08-16 21:19:50.333 Asignment_1[758:24272] buyer1收到商品后,为apple1支付了12

2015-08-16 21:19:51.334 Asignment_1[758:24272] buyer2收到商品后,为apple2支付了34

2015-08-16 21:19:52.340 Asignment_1[758:24272] buyer3收到商品后,为apple3支付了135

2015-08-16 21:19:53.341 Asignment_1[758:24272] buyer4收到商品后,为apple4支付了543

时间: 2024-11-03 05:27:05

oc中的blocks的功能,一种比代理简洁的方式的相关文章

OC中如何对内存进行管理的

OC中的内存管理主要由三种方式ARC(自动内存计数),手动内存计数,内存池: 1)ARC:这种方式和java类似,在你的程序的执行中,始终有一个高人在你背后准确的帮你收拾垃圾,你不用考虑它什么时候开始工作,怎么样工作,你只需明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就会彻底把它忘掉了,反正那个高人会帮我们收拾垃圾的,但遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品,所以iPhone不支持这个功能. 解决:通过alloc-inital方式创建的,创

OC中属性及方法

1.声明式属性    a.实例变量    b.声明属性        自动生成setter/getter方法        .h ->@property 属性类型 属性名;        .m ->@synthesize 属性名 = 实例变量名;    c.点语法2.IOS5中的属性    a.实例变量  省        会自动生成实例变量,实例变量名 等于 _属性名    b.声明属性        @property 属性类型 属性名;        @synthesize 属性名 =

OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray array]; // for (int i = 0; i < 13; i ++) { // [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; // } // NSLog(@"%@",arr);

C#中关于增强类功能的几种方式

C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.仅当使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才可使用. namespace Extensions { public static class StringExtension { public stati

QF——OC中把方法当做参数传递的两种形式(@selector和block)

@selector(): 可以理解@selector()就是取类方法的编号,他的基本行为等同于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在C语言中,可以直接把一个函数名赋给一个函数指针,但是在OC中不行,而是要通过@selector语法来取.它的括号里传入的是方法名,返回结果是 SEL类型,该类型本质上就是方法的编号(地址). block: block,名为代码块.它和函数很相似,有返回值,有名称,有参数列表. 格式: 返回值类型 (

关于OC中的几种延迟执行方式

第一种: [UIView animateWithDuration:3 delay:3 options:1 animations:^{ self.btn.transform = CGAffineTransformMakeTranslation(300, 400); } completion:^(BOOL finished) { NSLog(@"view animation结束"); }];//不会阻塞线程,animations block中的代码对于是支持animation的代码,才会有

OC中的Values——and——Collections

值和集合 在OC中可以使用C中的基本数据类型. 可以在类的实现里面对这些基本数据类型的属性进行C中的:++ – += -= *=等操作. 如下所示: //---------接口声明----------- @interface XYZPerson : NSObject @property int age; -(void)gettingOlder; @end //----------接口实现----------- @implementation XYZPerson -(void)gettingOld

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s