IOS 开发delegate和block的区别整理资料收集 (文章中内容有参考网络资料)
2017-10-11 16:04
696 查看
1.使用代理和gcd block方式实现子view里控件的值到父viewcontroller里传值使用
一、代理的方式
1)在子view.h中声明代理的方法名
@protocol OnlineHDoctorDetailHeaderViewDelegate
- (void)searchBegin:(UITextField *textField);
@end
2)在view.m里实现这个代理
[self.idelegate searchBegin:textField];
3)在父viewcontroll中添加代理<OnlineHDoctorDetailHeaderViewDelegate>
- (void)searchBegin:(UITextField *textField)
{
//使用自view里的值 实现相关操作
}
二、block方式
1)在子view.h里定义一个类型 typedef void(^searchNavViewBlock)(UITextField *textField);
2)在子view.h里定义一个回调函数 block类型属性
@property (nonatomic, copy) searchNavViewBlock searchBeginBlock;
3)在子view.m里实现block
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
if (self.searchBeginBlock) {
self.searchBeginBlock(textField);
}
[self.textField resignFirstResponder];
return YES;
}
4)在父viewcontroller里调用这个block
[self.navView setSearchBeginBlock:^(UITextField *textField) {
if (!NULLString(textField.text)) {
[ws saveHistoryDataWithKey:textField.text];
[ws searchRequestDataWithCurrentKey:textField.text
pageIndex:0
success:nil
failure:nil];
}
[ws.navView.textField resignFirstResponder];
}];
通常我写一个不带参数的块回调函数是这样写的
在 . h 头文件中
定义类型
typedef void (^leftBlockAction)();
在定义一个回调函数
-(void)leftButtonAction:(leftBlockAction)leftBlock;
在.m 文件中
-(void)leftButtonAction:(leftBlockAction)leftBlock{
leftBlock();
}
今天学会一个高大上的方法
只要在.h 头文件定义属性方法
@property (nonatomic,copy) dispatch_block_t leftBlockAction;
在.m文件 调用的方法里调用
if (self.leftBlockAction) {
self.leftBlockAction();
}
在另个模块里直接
MyAlertView *alert = [[MyAlertView alloc]init];
alert.leftBlockAction = ^() {
NSLog(@"left button clicked");
};
是不是对第一种方法简单了很多
你要知道你的回调是一个什么性质的回调,如果这个回调是一个不定期触发,或者会多次触发的,那么 Delegation 应该更适合;如果这个回调是一个一次性的,并且和调用方法是单线性关系的,那么 Block 应该更适合;如果这个回调是广播性质的,需要很多个不同的类都接收到,那么 NSNotification 更适合。
说到这个问题其实还应该加上notification,以下做一下这三者之间的对比:1.delegate(1)特点:一对一;(2)适用场景:UI响应事件,回调方法(网络请求)(3)优点 a. 较为清晰的语法定义,减少维护成本; b. 不需要三方监听和传输数据;(4)缺点 a. 书写麻烦,要定义多个协议; b. 多个对象间通信时不太实用;2. block(1)特点:一对一;(2)适用场景:回调方法(网络请求)(3)优点 a. 书写简单; b. 易读,易维护;3. notifications(1)特点:一对多;(2)适用场景:跨层/功能通信,减小耦合;(3)优点 a. 代码简单; b. 解决多对象之间的监听问题;(4)缺点 a. 轮询机制耗资源; b. 不易维护; c. 需要第三方对象来作为监听和被监听的对象; d. dealloc中需要removenotification。
作者:Mr Killer
链接:https://www.zhihu.com/question/29023547/answer/129108189
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Bill Cheng
链接:https://www.zhihu.com/question/29023547/answer/110199052
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、代理的方式
1)在子view.h中声明代理的方法名
@protocol OnlineHDoctorDetailHeaderViewDelegate
- (void)searchBegin:(UITextField *textField);
@end
2)在view.m里实现这个代理
[self.idelegate searchBegin:textField];
3)在父viewcontroll中添加代理<OnlineHDoctorDetailHeaderViewDelegate>
- (void)searchBegin:(UITextField *textField)
{
//使用自view里的值 实现相关操作
}
二、block方式
1)在子view.h里定义一个类型 typedef void(^searchNavViewBlock)(UITextField *textField);
2)在子view.h里定义一个回调函数 block类型属性
@property (nonatomic, copy) searchNavViewBlock searchBeginBlock;
3)在子view.m里实现block
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
if (self.searchBeginBlock) {
self.searchBeginBlock(textField);
}
[self.textField resignFirstResponder];
return YES;
}
4)在父viewcontroller里调用这个block
[self.navView setSearchBeginBlock:^(UITextField *textField) {
if (!NULLString(textField.text)) {
[ws saveHistoryDataWithKey:textField.text];
[ws searchRequestDataWithCurrentKey:textField.text
pageIndex:0
success:nil
failure:nil];
}
[ws.navView.textField resignFirstResponder];
}];
通常我写一个不带参数的块回调函数是这样写的
在 . h 头文件中
定义类型
typedef void (^leftBlockAction)();
在定义一个回调函数
-(void)leftButtonAction:(leftBlockAction)leftBlock;
在.m 文件中
-(void)leftButtonAction:(leftBlockAction)leftBlock{
leftBlock();
}
今天学会一个高大上的方法
只要在.h 头文件定义属性方法
@property (nonatomic,copy) dispatch_block_t leftBlockAction;
在.m文件 调用的方法里调用
if (self.leftBlockAction) {
self.leftBlockAction();
}
在另个模块里直接
MyAlertView *alert = [[MyAlertView alloc]init];
alert.leftBlockAction = ^() {
NSLog(@"left button clicked");
};
是不是对第一种方法简单了很多
你要知道你的回调是一个什么性质的回调,如果这个回调是一个不定期触发,或者会多次触发的,那么 Delegation 应该更适合;如果这个回调是一个一次性的,并且和调用方法是单线性关系的,那么 Block 应该更适合;如果这个回调是广播性质的,需要很多个不同的类都接收到,那么 NSNotification 更适合。
说到这个问题其实还应该加上notification,以下做一下这三者之间的对比:1.delegate(1)特点:一对一;(2)适用场景:UI响应事件,回调方法(网络请求)(3)优点 a. 较为清晰的语法定义,减少维护成本; b. 不需要三方监听和传输数据;(4)缺点 a. 书写麻烦,要定义多个协议; b. 多个对象间通信时不太实用;2. block(1)特点:一对一;(2)适用场景:回调方法(网络请求)(3)优点 a. 书写简单; b. 易读,易维护;3. notifications(1)特点:一对多;(2)适用场景:跨层/功能通信,减小耦合;(3)优点 a. 代码简单; b. 解决多对象之间的监听问题;(4)缺点 a. 轮询机制耗资源; b. 不易维护; c. 需要第三方对象来作为监听和被监听的对象; d. dealloc中需要removenotification。
作者:Mr Killer
链接:https://www.zhihu.com/question/29023547/answer/129108189
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Bill Cheng
链接:https://www.zhihu.com/question/29023547/answer/110199052
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- KVM 网络 资料整理(网上收集)(这个真的很好)
- linux+gtk+c/c++ 开发资料收集整理
- flex高级开发参考文章收集
- 好久没发表文章了,来篇iOS开发知识整理!
- 收集整理的几个iOS阅读应用开发相…
- 由于最近网站内容需要更新的还是满多的,于是想开发一个采集系统。收集了一下资料。
- cocoachina ios 开发资料整理
- linux+gtk+c/c++ 开发资料收集整理
- 【IOS游戏开发】之 IOS推送的资料收集
- 【转载内容】iOS IM开发的一些开源、框架和教程等资料
- iOS开发中 delegate和 block传值方法的比较
- 关于office插件的网络资料收集(一些比较经典的文章)
- 2014资料整理--iOS开发流程总结
- 近百个Android开发教程和资料收集整理打包下载
- IOS开发(45)之delegate和Notification的区别
- 2014资料整理--IOS开发常用库
- 好久没发表文章了,来篇iOS开发知识整理!
- web 开发中的各种页面的提交请求数据方法汇总(持续更新,内容收集来自各网络)
- Android 安卓开发参考书电子书 资料整理共享(点击书籍封面传送)
- IOS开发之delegate和Notification的区别