[翻译]通讯模式(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观察。spa

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更好。code

End

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

相关文章
相关标签/搜索