为了账号安全,请及时绑定邮箱和手机立即绑定

iOS 设计模式 Design Patterns

标签:
iOS

App开发过程中,随着业务的不断发展,代码和逻辑不断增加,有时候不得不重构以前的代码,好的架构,利于代码的拓展和重构,下面就简单探讨一下iOS中常见的设计模式吧。

webp

设计模式

MVC

一个简单的举例

  • 初期:依据MVC模式,把项目进行ModelViewController简单分类:

webp

  • 中期:业务模块增加了,ModelViewController越来越多,于是,根据业务模块的分类,在每个模块内使用MVC模式:

webp

  • 后期:MVC模式还是没有干净、很好地分割模块,在用户点击网络请求JSON解析数据这些方面,会有交叉重叠的地方:

webp

webp

MVC-N

把项目分为四类:ModelViewControllerNetworking

webp

MVC-N

MVVM

上面MVC-N新建了一个模块,来管理网络请求,然而,获取数据后的数据解析,还是放在了Controller中,如何让Controller专注于用户交互呢?而MVVM模式,添加了ViewModel来管理数据解析和网络请求等,解决了这个问题。

MVVM中,Controller依然存在,但是不再直接持有ModelController持有ViewModelModel被交给ViewModel管理。

webp

MVVM

Multicast Closure DelegateNEW

代理模式大家应该最熟悉了,UIKit中很多,经典的UITableViewDelegateUIAlertViewDelegate. 基本原理是定一个协议Protocol,列出需要实现的方法协议,然后交给指定的代理实现,可以有多个代理,为了避免循环引用,代理delegate的属性设为weak,

多播委托(MulticastDelegate)

    多播委托(MulticastDelegate)继承自 `Delegate` ,表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。实际上,我们自定义的委托的基类就是 `MulticastDelegate`。

webp

多播委托

假如现在有一个需求,我们以图片下载为例。这里先忽略哪些SDWebimage等已经封装好的第三方类库。对于图片下载一般的过程如下:

  1. 先判断该图片url是否已经下载完毕。如果已经下载完毕那么直接回调显示图片。如果没有下载那么进入下载过程。

  2. 使用合适的图片下载器下载图片。

  3. 图片下载完毕后回调显示图片。并且把该图片存到缓存中。

这里的难点是回调。如果一个页面中有多个地方需要显示同一张图片,那么势必会发生这样一种情况,就是同时有多个请求下载同意url的图片,并且下载完成后需要同时在多个地方显示图片。要是实现这样的需求,用现有的方案貌似很难解决。有的同学会想到通知中心,但是通知中心其实是一个广播服务,只要注册了接受该通知那么所有的注册者都能收到通知,但事实上我只需要在我需要下载的那个url的图片下载完后给出通知,而不需要所有的下载完毕事件都通知。这时候我们就需要多播委托了。

普通的delegate只能是一对一的回调,无法做到一对多的回调。而多播委托正式对delegate的一种扩展和延伸,多了一个注册和取消注册的过程,任何需要回调的对象都必须先注册。比较经典的就是XMPPframework这个框架,用了很多多播委托模式(GCDMulticastDelegate)。

多播闭包委托

多播闭包委托 (Multicast Closure Delegate)继承自多播委托。

webp

多播闭包委托



作者:吃蘑菇De大灰狼
链接:https://www.jianshu.com/p/6c28b954ad6c


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消