MUBlockDelegate——一个基于Block的通用委托实现
来源:互联网 发布:康佳lc40ds60c数据 编辑:程序博客网 时间:2024/05/02 01:01
1.通常我们这样用委托(Delegate):
//声明一个委托协议 @protocol TestProtcol <NSObject> - (NSString*) testDelegateMethod:(NSString*) aString; @end //实现一个委托协议 @interface TestDelegateImpl : NSObject<TestProtcol> @end @implementation TestDelegateImpl - (NSString*) testDelegateMethod:(NSString *)aString { return aString; } @end
然后新建一个使用委托的测试类
#import "TestProtcol.h" //需要委托的测试类,例如tableview、scrollview等 @interface TestObject : NSObject //维护一个委托对象 @property(nonatomic, weak) id<TestProtcol> delegate; - (NSString*) callDelegate:(NSString*) aString; @end @implementation TestObject @synthesize delegate = _delegate; //调用委托方法获取返回结果 - (NSString*) callDelegate:(NSString*) aString { if ([_delegate respondsToSelector:@selector(testDelegateMethod:)]) { return [_delegate testDelegateMethod:aString]; } return nil; } @end
以上就是一般委托模式的实现,下面来做一下测试:
TestDelegateImpl* testDelegate = [[TestDelegateImpl alloc] init]; TestObject* testObject = [[TestObject alloc] init]; testObject.delegate = testDelegate; //测试委托类是否能正常返回结果 NSLog(@"result:%@", [testObject callDelegate:@"testNormal"]);
2.但是,如果你使用了MUBlockDelegate...
不需要写委托协议,也不需要新建委托实现,你只需要新建一个BlockDelegate
//anInvocation用来处理返回结果,调用参数按照顺序放置在NSArray里面。 MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForSelectorString:@"(@)testDelegateMethod(@)" delegateBlock:^(NSInvocation *anInvocation, NSArray *params) { //这里便是委托方法的实现。 //简单地把第一个参数拿出来,返回。 NSString* testString = [params objectAtIndex:0]; [anInvocation setReturnValue:&testString]; }];
做一些测试:
TestObject* testObject = [[TestObject alloc] init]; testObject.delegate = (id<TestProtcol>)testDelegate; NSString* testResult = [testObject callDelegate:@"testBlock"]; NSLog(@"testResult:%@", testResult);
程序正常输出:testBlock
另外,你还可以用过Class和Protocol来获得配置好的blockDelegate实例:
MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForClass:[TestDelegateImpl class] selector:@selector(testDelegateMethod:) delegateBlock:^(NSInvocation *anInvocation, NSArray *params) { NSString* testString = [params objectAtIndex:0]; [anInvocation setReturnValue:&testString]; }]; MUBlockDelegate* testDelegate = [MUBlockDelegate delegateForProtocol:@protocol(TestProtcol) selector:@selector(testDelegateMethod:) delegateBlock:^void(NSInvocation* anInvocation, NSArray *params) { NSString* testString = [params objectAtIndex:0]; [anInvocation setReturnValue:&testString]; }];
3.源码下载:
下载地址: GitHub
- MUBlockDelegate——一个基于Block的通用委托实现
- block 实现跟 委托一样的效果
- Block实现委托机制
- 委托的应用——通用冒泡排序
- C# 委托的一个实现
- 基于委托机制的定时器的实现
- 一个通用dao的实现
- 一个通用dao的实现
- IEditableObject的一个通用实现
- 一个基于Ajax的通用(组合)查询
- 用递归和委托实现通用的树遍历
- 通用排序函数的功能实现(利用接口和委托实现泛型[通用]排序)
- 基于通用可编程GPU的视频编解码器——架构、算法与实现
- iOS每日一记————————简单的实现委托 Block代码块 功能 和简单的自定义View
- 基于JDBC的通用分页实现
- 基于C#的通用A*算法实现
- 基于Mybatis的通用Service层实现
- C#一个singleton的通用实现
- 【摄影笔记一】曝光参数
- HBase安装与配置
- c++ cout<<*p<<endl<<*p++;被重载导致输出错误问题原因!
- 【摄影笔记二】测光
- Apache编译安装php错误 libphp5.so : No such file or directory apxs:Error: Command failed with rc=65536
- MUBlockDelegate——一个基于Block的通用委托实现
- Paul Graham:如何做好天使投资
- 不用凡事换系统,系统还原来帮你
- 【摄影笔记三】光圈和快门
- 【摄影笔记四】关于图像的几个概念
- Linux 链表学习
- jquery操作滚动
- 关于struts2的思考和更深的认识
- asp.net 把.aspx重写成.html的配置方法。