zoukankan      html  css  js  c++  java
  • 通知/代理/block 三者比对

    通知

    :   “一对多”,”多对一” 传值

    四个步骤: 
     1.发送通知
    2.创建监听者
    3.接收通知
    4.移除监听者
            

    使用场景:
    1- 很多控制器都需要知道一个事件,应该用通知;
    2 - 相隔多层的两个控制器之间跳转

    注意事项:
      1, 一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理
     2,创建了观察者,在dealloc里面一定要移除;

    —————————————————————————————————————————————————————————————

    代理

    “一对一”,对同一个协议,一个对象只能设置一个代理delegate


    六个步骤:
    1.声明一个协议,定义代理方法
    2. 遵循协议
    3.设置一个代理对象
    4.调用代理方法
    5.给代理赋值
    6.实现代理方法

    注意事项:

    1,单例对象不能用代理;
    2,代理执行协议方法时要使用 respondsToSelector检查其代理是否符合协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃



     使用场景:

    公共接口,方法较多也选择用delegate进行解耦 
    iOS最常用tableViewDelegate,textViewDelegate 
     iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。


    —————————————————————————————————————————————————————————————


    block

    什么是Block:
    Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。
    Blocks语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。

    闭包就是能够读取其它函数内部变量的函数。就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性。



    使用场景:
    一:动画
    二:数据请求回调
    三:枚举回调
    四:多线程gcd
    ...

     异步和简单的回调用block更好 
    BLOCK最典型的是大所周知的AFNETWORK第三方库。

    注意事项:

    block需要注意防止循环引用:
        ARC下这样防止:
    __weak typeof(self) weakSelf = self;
      [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
           [weakSelf doSomething];
        }];

         非ARC
    __block typeof(self) weakSelf = self;
      [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
           [weakSelf doSomething];
        }];



    ———————————————————————————————————————————————————————————
    delegate 和 block对比
     
        效率:Delegate比NSNOtification高;

     1,   Delegate和Block一般都是一对一的通信;


     2,   Delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信;

          Block:Block更加简洁,不需要定义繁琐的协议方法,但通信事件比较多的话,建议使用Delegate;


    3,  delegate运行成本低。block成本很高的。
    block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作 .

    4,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
        block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息


    5 Blocks 更清晰。比如 一个 viewController 中有多个弹窗事件,Delegate 就得对每个事件进行判断识别来源。而 Blocks 就可以在创建事件的时候区分开来了。这也是为什么现在苹果 API 中越来越多地使用 Blocks 而不是 Delegate。
  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/1224dashen/p/5423048.html
Copyright © 2011-2022 走看看