通信模式(Communication Patterns)

引言

看到标题的也许有一些老司机看过原文,此文是基于原文翻译加上自己理解,为了更好的学习iOS~(文章并没有写如何运用,主要是探讨什么时候用。)
原文地址:https://www.objc.io/issues/7-foundation/communication-patterns/

我们在开发过程中,常用的两个对象之间的相互通信的方式有很五种

  • Target-Action
  • Delegation
  • block
  • KVO
  • Notifications
    本文是讨论各个通信的使用,以及在什么时候用这些通信方式。在通信的过程中,往往一个是接收者,一个是发送者。
Target-Action

这个方式相信大家见的就很多了,在写Button或者手势的时候,都会用到addTagert这个方法。Target-Action是用于在用户界面事件响应中发送消息的典型模式,一般是用于处理动作消息。他包含了 两个数据,一个是选择子(selector),还有一个是接收人(target)。在iOS中,能触发Target-Action事件的一般是基于UIControl的(官方文档说是可以任何对象,不过基本上都是继承与UIControl的)。一般的Target-Action的接收事件如下:

-  (void)dosomething:(id)sender;

在Target-Action中,消息的接收者其实并不知道发送者是谁,发送者也不知道消息的接送者是谁。所以当target是nil的时候,会通过响应者链找到某一个接收者去响应这个消息。这个方式的缺点就是传递消息的时候不能带着自定义的参数。

Delegation

Delegation在苹果自己的FrameWorks里就经常使用,比如我们经常用的 tableViewdelegatedataSource。它允许我们去自定义某一个对象的行为,也可以(被)告诉我们这个对象发生了什么。在这个通信过程中,消息的发送者需要知道消息的接收者,也就是这个delegate。我们在用UITableView的时候往往会写tableView.delegate = self,就是让tableView这个消息的发送者知道消息的接收者是谁(self)。这样的耦合度会很低,大家应该都深有体会吧,哈哈哈,有时候可能会找不到这个方法在哪儿。。。
delegate protocol可以定义任何方法,所以你也可以用这些方法传递你想要传递的参数,而且delegate protocol可以响应这些方法返回的参数。可见delegate protocol的通信方式是非常的灵活和直接。

block

block也叫闭包函数,讲道理的说,只要是Delegation通讯模式下可以做的事情,都可以用block代替。相对来说,block对于代码的整体性体验较好,不会散落在各地。但是blokc会造成循环引用,也可能会提前释放。总之block应用起来,总是对新手那么的不友好。
block的能够抓取当前上下文的命名域,怎么说呢,就是你不需要知道这个具体是什么东西,里面是怎么样的,你可以直接更具他给的参数或者直接写你想要写的代码。

KVO

KVO是一种通知对象的属性发生改变的机制。KVO是一种灵活的方式去监听当前对象属性的改变,尤其是对于系统属性的监听,比如说UITableViewContentOffSet这个值改变的监听,可以帮我们实现一些比较酷炫的UI效果(你懂的)。
KVO的使用,需要一些必要的条件,比如说你的对象要支持Key-Value Observing机制。而且你要知道这个对象的生命周期,在你不需要的时候移除这个KVO观察。

Notifications

Notifications这通讯方式,就是一种很好的,系统给我们封装好的,一对多的广播。他最大的优势就是可以跨越层级,对代码架构的解耦很有帮助。(现在好像不能说一对多是他的优势了,貌似Swift里有多Delegate)
iOS系统在应用过程中会发很多通知,比如说UIKeyboardWillShowNotificationUITextViewTextDidChangeNotification等等各种。
NotificationsKVO一样,需要知道接收者的生命周期,在最后生命周期结束的时候注销这个NotificationsiOS大部分的生命周期结束的时候都会调用- (void)dealloc。所以其实用起来也比较简单。(当然你要是发生循环引用导致当前对象不能释放,那就没办法了(⊙﹏⊙)b)。

讨论

对比了这五种方式,那我们什么时候用呢。上面文章的作者给了这么一张图:

通讯模式.png

我想分享下自己对于通讯模式的看法。因为不会画图,画在纸上的话,字太丑了,就写文字吧。。。。
1.是否直接进行对象的交互而且不需要参数,比如说手势,Button这些的 。如果是的话,就用Target-Action
2.是否是多层级的,两个对象是否有联系,如果不是的话,就可以用Notifications
3.既然两个对象是有联系的,当你需要监听值发生变化的时候,可以使用KVO。(单存值变化,而不是其他动作响应的情况下)
4.我是否需要知道这个对象的具体东西,上下文的具体命名域。如果不需要的话,这个时候使用Block会好一点。比如说我们网络请求时候的回调各种,只要输入请求参数,然后写好回调。中间发生了什么,其实你知道不知道,并不影响使用。
5.对于Delegationblock我觉得是大部分情况下是可以互相替换的,因为关于循环引用这方面,现在各种WeakSelf,StrongSelf的文章。不过在某些情况,比如说你的消息发送者需要用到接收者给的返回值的时候,这个时候用Delegation在设计上来说比Block更好。

End

其实对于通讯模式这种理解,对于整体架构,包括响应式编程都有很好的帮助。

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

推荐阅读更多精彩内容

  • 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递。 本文将介...
    石丘阅读 1,673评论 4 7
  • 几种消息传递机制 首先我们来看看每种机制的具体特点。在这个基础上,下一节我...
    指尖猿阅读 369评论 0 0
  • 每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务。在这篇文章里,我们将介绍所有可用的消息传递机制,...
    爱敲代码的果果阅读 3,894评论 0 2
  • 介绍: KVO -- 值改变 + 两要求 当对象中的某个属性值发生了改变,可以对这些值的观察者做出通知。 有两个要...
    钱嘘嘘阅读 1,103评论 0 9
  • 设计模式 1.delegate和notification什么区别,什么情况使用? 2.描述一下KVO和KVC。 K...
    丶逐渐阅读 1,940评论 3 2