• IOS 开发delegate和block的区别整理资料收集 (文章中内容有参考网络资料)


    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
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【报错问题】mysql无法使用别名查询
    【报错问题】java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode
    【源码】-springboot 启动后立马执行的方式
    【LINUX】$搭配使用的含义
    【JAVA】javaMail附件名超过60显示错误
    【Gradle】简单入门
    慢SQL案例之一
    【Flink】一. 什么是Flink?
    【spring基础】环境的搭建与后台
    [org.apache.common][打算学习开源工具包]
  • 原文地址:https://www.cnblogs.com/lzxpythonhome/p/7651099.html
Copyright © 2020-2023  润新知