关于iOS面向协议编程—解藕

首先说一说解藕的思想。说白了就是把某些可以独立出来的模块拿出来看做单独app开发。。。把一个大团队 分解成小团队。便于管理提高效率。

那言归正传,思想呢 就是有多对多(网状结构)分解成多对一(辐射结构)

其中方案很多。今天我们来一起探讨下面对协议编程思想的结构方式。

备用知识请查看下OC的运行时runtime中消息转发的forwardingTargetForSelector方法。

其中核心就是把所有需要的类都用一个类来代替,然后用这个类调用的方法。当然这个代替的类并没有实现这个类调用的方法。就会调用消息转发forwardingTargetForSelector。我们在forwardingTargetForSelector方法中给这个类的方法的实现。

为代码

例如[loginObj login];  [logoutObj logout];

转化后[<@protocol>publicObj login]; [<@protocol>publicObj logout];

然后publicObj没有实现login方法。我们就会在 publicObj forwardingTargetForSelector 中为此方法实现。

说到这感觉可能还是比较模糊。。那么我们来写个demo 上代码!

首先是一个单例基类MBaseInterface.h


关于iOS面向协议编程—解藕_第1张图片

然后是MBaseInterface.m


关于iOS面向协议编程—解藕_第2张图片
关于iOS面向协议编程—解藕_第3张图片
关于iOS面向协议编程—解藕_第4张图片

在app delegate中注册你要加载的模块

关于iOS面向协议编程—解藕_第5张图片

然后

主要就是给interface.iml复制给相关的类(其中该类中实现protocol里面的方法)

关于iOS面向协议编程—解藕_第6张图片

准备工作做完后:我们来看看调用吧

首先拿到

写个宏先

第一句话是拿到模块管理类(单例)

第二句话是通过模块管理类拿到模块

第三句话是通过协议名字拿到iface(是上一段代码字典的反操作)

关于iOS面向协议编程—解藕_第7张图片

//2016.9.5 注释上面一行,改用如下解耦的方式

GETIFACE(iface, MDownloadManagerProtocol, DownLoadModuleName);

[iface aSelector]

这样就可以了!!由于时间原因 暂时写这么多 

写的还不够清晰。。还有有不明白的可以留言 我会即时回复 一起学习探讨!

你可能感兴趣的:(关于iOS面向协议编程—解藕)