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

  • 相关阅读:
    LeetCode 773. Sliding Puzzle
    oracle latch工作原理
    Oracle关于锁的几种类型和参数
    Java的反射机制
    JAVA多线程与并发学习总结
    Spring 概念详解
    Spring的AOP
    spring面试题 对DI , AOP概念的理解
    双11的架构
    Java线程的定义
  • 原文地址:https://www.cnblogs.com/lzxpythonhome/p/7651099.html
Copyright © 2011-2022 走看看