关于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面向协议编程—解藕】然后是MBaseInterface.m
文章图片
文章图片
文章图片
在app delegate中注册你要加载的模块
文章图片
然后
主要就是给interface.iml复制给相关的类(其中该类中实现protocol里面的方法)
文章图片
准备工作做完后:我们来看看调用吧
首先拿到
写个宏先
第一句话是拿到模块管理类(单例)
第二句话是通过模块管理类拿到模块
第三句话是通过协议名字拿到iface(是上一段代码字典的反操作)
文章图片
//2016.9.5 注释上面一行,改用如下解耦的方式
GETIFACE(iface, MDownloadManagerProtocol, DownLoadModuleName);
[iface aSelector]
这样就可以了!!由于时间原因 暂时写这么多
写的还不够清晰。。还有有不明白的可以留言 我会即时回复 一起学习探讨!
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- iOS中的Block
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 关于Ruby的杂想
- 关于读书的思考