协议与Block
简单的委托实现
假如我们实现一个方法getAllStudent
,但是在方法的网络请求部分要类NetWorkTool
类里的方法getAllStudentFromNetWork
实现.
那么getAllStudent
需要方法getAllStudentFromNetWork
的返回数据。如果是同步网络请求,直接使用方法返回数据就好,如果是异步线程,就只能使用方法调用来返回数据来。
类图结构如下图
出现的问题
如果是只有一个Student
类中使用网络请求那没有什么问题。
但是如果现在有Teacher
类,Animal
类…一堆的类中使用,如果使用一次,在接口里定义一次那也太烦人了。
协议
第一种解决方法是用协议。
既然要在多接口中定义方法,那么就抽出来好了。抽出一个接口文件进行单独定义。
但是OC的接口文件是与实现文件一同创建的同名文件,并不支持多接口的。
所以就定义了另外一个名字叫协议。
但是我们需要知道哪些类里添加了协议,就有了实现协议。
Block
虽然有了协议但是
第一、协议有点难以理解,和接口容易混淆。
第二、多定义一个协议文件,还要在需要的接口文件中实现协议。
有没有更好的办法呢,于是Block
就横空出世了。
Block
其实就是一个函数,只是一个没有名字的函数而已,就叫匿名函数。
OC里函数里是不能定义函数的,但是可以有Block
。
于是我们在getAllStudent
方法里定义一个函数(匿名函数Block
),在getAllStudentFromNetWork
函数中直接调用这个函数就可以了,因为匿名所以不需要在接口中定义了。
问题完美解决了。内存什么的先不管了。
当然这是根据实际使用我自己的理解。
协议更重要是约定,在各个设计模式中都要使用。它增加了代码的灵活性,同时代码复杂度变高。