block,delegate, notification, KVO 的使用场景

delegate

delegate 是代理模式的一种实现,就是委托他人帮自己做事。<事件一般通过protocol约定>
一般的使用场景是 控制器的反向传值传递一个事件, A类(委托方)触发某些方法,需要由B 类(代理方)做出响应或处理。这种设计 耦合更低,扩展性更好(如tableView 的代理可以是任意实现代理方法的对象 ,已应对更对变更)

block

block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数。同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能。在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。采用block技术能够抽象出很多共用函数,使代码高聚合,可读性,可维护性高(如网络库AFNetwork,GCD 中 ,链式编程中)。

对于反向传值 block写法更简练,不需要写protocol
使用block需要注意防止循环引用, 解决方案是用weakself。
block 类型属性使用copy 修饰。
block在堆中 ,想改变block里面变量的值, 需要加参数__block

Notification

一个消息通知机制,类似广播。观察者只需向消息中心注册感兴趣的东西,当有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象。通知是一种在程序中可以获得高效协作同时保持较高内聚性的机制。他减少了程序中对象相互之间的强依耐性(这种依赖性会大大降低程序中代码的可复用性)。苹果给我们封装了这个NSNotificationCenter,让我们可以很方便的进行通知的注册和移除。
使用要注意addObserver后,必须要有remove操作(不移除可能会有野指针问题)。

KVO

观察者模式的一种实现, 一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。这是一个对象与另外一 个对象保持同步的一种方法,用key paths来观察属性,能够提供观察的属性的最新值以及先前值;
使用步骤为
1.注册,指定被观察者的属性, 2. 实现回调方法 , 3. 移除观察(不移除会崩溃),

使用场景

1. delegate or block

  • 如果对象有超过一个以上的不同事件源,需要使用delegate, 使用规范的命名区分不同事件的回调,代码很清晰,易于调试;
    相反如果对每个事件注册相应的block 显然不合理,如果创建一个可以接受任何可能输入值得block,即不简单,也不易读。

  • delegate是“一对一”的关系,一个对象只能设置一个代理delegate,例如 CLLocationManager 定位成功后会通过delegate 通知一个对象(必须只有一个),所以如果需要更多对象响应定位成功事件,我们最好创建其他的locationManager。如果CLLocationManager是个单例,那就只能悲剧的切换delegate 对象(或自己实现广播机制),单例的设计本来就是共享的资源,和“一对一”的逻辑矛盾
    再看 UIAccelerometer的实现,早期版本中 accelerometer 单例对象有一个delegate,导致使用中必须偶尔切换一下;后来版本改成的 block实现 ,任何对象都可以访问这个block儿不需要阻止其他的对象来接收更新,block可以在创建事件的时候区分开来。所以单例对象就不能用代理

  • 一般的delegate方法都(大多数dataSource )有返回值 , 像是委托在询问某些state(可能是对象的值,也可能是对象本身);而一个block 可以合理的包含 state(block真正是对象的一个属性),如果对象的请求带有附加信息,更应该使用delegate。

  • 在苹果的API中 block 一般封装成 hander Completion 回调执行结果,所以block更面向结果,比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息就可以选择block回调;
    delegate更注重过程信息的传输:如发起一个网络请求,是否此时请求已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败等。

delegate 面向过程的 可以在所有事件中维持 state 而多个独立的block不能

2.notifation or KVO

  • 使用 通知的类之间 联系松散 ,发送方不需要知道谁去注册通知,接收方也不用知道谁发的通知, 这在一定程度上也破坏了封装性,但是有些场合就是由这种需求,比如 网络状态的变化, application 的生命周期状态都设计成通知让其他类去注册。

    使用KVO 的 类之间 联系紧密, 因为观察者要明确指定被观察者的属性,他们就像绑到一起一样,共同变化, 例如购物车中总价 要和商品数量一同变化 。

  • 通知 关注** 事件 ** 例如 application 从后台到前台的事件 就设计成通知
    KVO 关注 属性(值) 如 检测股票价格的变化展示在view上

部分摘至 stablekernel.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 1.KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受...
    BEYOND黄阅读 1,534评论 0 6
  • 设计模式 1.delegate和notification什么区别,什么情况使用? 2.描述一下KVO和KVC。 K...
    丶逐渐阅读 1,953评论 3 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,133评论 30 470
  • 介绍: KVO -- 值改变 + 两要求 当对象中的某个属性值发生了改变,可以对这些值的观察者做出通知。 有两个要...
    钱嘘嘘阅读 1,121评论 0 9