除了用delegate进行代理传值,block也可以实现数据的传递,并且实现起来更简单。
一、房屋中介
设想我们现在需要租房子,我们要先找一个中介,让他来帮助我们。
//Agent.h
#import <Foundation/Foundation.h>
typedef void (^RentHouseOkBlock) (NSString * result);//首先类型重定义一个block,
//参数作为回调的数据,其实就是通过那个参数来实现的数据回调
@interface Agent : NSObject
@property (nonatomic,copy)RentHouseOkBlock block;
-(void) renthouse:(RentHouseOkBlock)block;//声明agent类所进行的行为,并通过参数block回调数据
@end
我们进行类型重定义了一个block,这个block带了一个参数,这个参数实际上就是要返回的数据。然后我们在下面用RentHouseOkBlock我们定义了一个属相变量 block(属性关键字时 copy) 。然后我们定义了Agent要为我们做的事 renthouse ,中介在完成这件事后应该要返回给我们结果,所以我们给它带了一个参数 block 到时候通过 block的参数可以得到我们的结果。
#import "Agent.h"
@implementation Agent
-(void)renthouse:(RentHouseOkBlock)block{
//进行一系列数据处理之后,通过block回调数据,block的参数就是回调的数据
block(@"find it!");
}
@end
在Agent的实现文件中,我们实现刚刚声明的方法,这里省略了对数据的具体操作过程,我们最后调用block然后为它添加参数,这些参数应该就是上面经过一系列操作后得到的数据中用户希望得到的数据,我们通过block来返回这些数据。我们这里用了一个简单的字符串代替。
现在,我们有这个需求了--租房子
//Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)needhouse;
@end
//Person.m
#import "Person.h"
#import "Agent.h"
@implementation Person
-(void)needhouse{
Agent * xw = [Agent new];
[xw renthouse:^(NSString *result) {
NSLog(@"\nwe have recieved your message:%@",result);
}];
}
@end
我们定义了一个Person类,这个类中声明了person的需求--需要租房子,在它的实现文件中,我们实现这个方法,首先我们要找到一个中介,这里是 xw 然后我们让 xw 去帮我们租房子(调用 xw的renthouse方法),在renthouse方法中,我们在要用到block时才去定义这个block到底要做什么,这个block在 Agent.h 中已经声明过了,带有一个OC字符串类型的参数,renthouse的具体操作在Agent的实现文件中:首先对数据进行操作,然后通过调用block返回数据,我们返回的是 find it! ,所以流程就会转到 person.m中block的实现处,最后将返回的数据通过block提供的参数将中介返回的数据给要租房的人。
二、block回调数据实现步骤
1.我们首先要确定处理数据的一方,在其头文件中重定义一个带参数的block(参数用来传递回调的数据),并声明它的带参数的处理数据的方法。
2.在处理数据的一方的实现文件中,对那个方法实现,最后通过使用参数block来回调数据。
3.在需要回调数据的一方的实现文件中定义block的具体实现。