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 *arrGoods=@[[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])

{

_name=@"";

_goods=@"";

}

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

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

  1. OC中的私有变量和description

    .OC中的私有变量 在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只 是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private ...

  2. OC中属性及方法

    1.声明式属性    a.实例变量    b.声明属性        自动生成setter/getter方法        .h ->@property 属性类型 属性名;        .m ...

  3. 在OC中调用Swift类中定义delegate出现:Property 'delegate' not found on object of type ...

    找了许久没找到答案, 在下面的链接中, 我解决了这个问题: http://stackoverflow.com/questions/26366082/cannot-access-property-of- ...

  4. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

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

    C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...

  6. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  7. OC中数组排序的3种方法

    总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 大体上 ...

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

    第一种: [UIView animateWithDuration: delay: options: animations:^{ self.btn.transform = CGAffineTransfo ...

  9. OC 中的 weak 属性是怎么实现的?

    OC 中的 weak 属性是怎么实现的,为什么在对象释放后会自动变成 nil?本文对这个问题进行了一点探讨.环境 mac OS Sierra 10.12.4 objc709参考答案 搜索后发现runt ...

随机推荐

  1. 杭电 HDU 2717 Catch That Cow

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. 51单片机 | 实现SMG12864液晶显示器操作

    ———————————————————————————————————————————— SMG12864液晶显示器 128*64个点位,可以显示图形或8*4个汉字 - - - - - - - - - ...

  3. jquery:选择器(转)

    http://www.cnblogs.com/kissdodog/archive/2012/11/05/2755103.html

  4. 转Python 标准库 urllib2 的使用细节

    Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库.这里总结了一些 urllib2 库的使用细节. 1 P ...

  5. J2EE之字符编码输出

    1. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  6. nginx反向代理做cache配置

    前序:请耐性子看完,前面的这个配置可以达到按后缀名进行缓存,但无法被purge.后面的配置可以被purge.具体实施方案按个人情况而定. 需要第三方的ngx_cache_purge模块:wget ht ...

  7. tigervnc环境搭建

    在root用户下执行以下操作: 1.安装tigervnc yum install tigervnc tigervnc-server 2.配置tigervnc 编辑vncservers文件,执行如下命令 ...

  8. ubuntu 16.04.3 安装完成后的一些初始化工作

    虚拟机安装前记得把桥接调好! 1. 重置root密码 sudo passwd, 然后系统会让你输入密码,这时输入的密码就是root用户的密码,su root切用户 2. 设置固定IP,有重启服务功能令 ...

  9. 用android studio创建第一个安卓程序加载html5 页面

    前言 软件版本:android studio v1.0正式版,由于v0.x以来软件变化一直比较大,很多问题搜索的解决方案也都是v0.x版本时代的,故首先声明一下版本. 动机:由于工作中需要对移动端软件 ...

  10. PHPstorm如何导入字体主题

    概要: 今天在安装phpstorm的时候发现导入字体主题时,出了问题,这个问题总是困惑我,并且曾经遇到过,没记录下来,所以想着这次记录下来吧.网上搜的稀里糊涂的,还是自己做个summary! 前提: ...