首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS-组件化(OC篇)

iOS-组件化(OC篇)

原创
作者头像
编程怪才-凌雨画
修改于 2020-10-09 08:36:52
修改于 2020-10-09 08:36:52
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

前言

网上关于组件化的理论很多而且已经比较成熟,理论方面请参看这篇集合文章iOS组件化。

一、组件化的初衷。

  • 有利于代码模块的封装和复用。
  • 对不同的业务模块可以进行物理隔离(通过git私有 仓库权限控制),进一步提升代码的稳定性和安全性。
  • 项目整体结构层次分明,便于后期维护。
  • 便于项目功能细分,颗粒划分更细,分配工作更合理,项目时间节点更容易掌控,便于进行敏捷开发
  • 便于进行单元测试

二、组件化开发过程。

1、要组件化必须进行解耦。

我们谈解耦,并不是完全解除代码之间的耦合,通过学习和实践这是不合理也不可能的。我们解耦的目的其实是为了解除代码模块相互间的依赖,或者说我们的目的就是让代码模块变得单向依赖,像一个插头一样可以自由拔插。 (合理 不合理的 图)

2、模块化与解耦理论模块化与解耦

因为个人精力有限,此篇主要是记录组件化架构的实践,故这里只以功能模块划分组件,模块化可以根据自身项目自己封装对应模块。

3、组件化架构设计

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群642363427不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

三、组件化架构实现。

1、目前业界常见的模块间通讯方案大致如下几种:

基于路由 URL 的 UI 页面统跳管理(url-block)。 基于反射的远程接口调用封装(target-action)。 基于面向协议思想的服务注册方案(protocol-class)。 基于通知的广播方案(NSNotification)。

可以使用一种或几种,我这里选用了基于反射的远程接口调用封装(target-action)和基于路由 URL 的 UI 页面统跳管理(url-block)来进行封装。

2、路由的实现:

网上成熟方案很多JLRoute就是一个非常好的路由框架,但是个人感觉JLRoute依然比较庞大,功能也不够单一。因此自己实现了一个简单的路由框架PTRouter。

PTRouter,支持了注册scheme。注册scheme这一特性,可以更方便的调用诸如第方分享,或是统计SDK集成使用。PTRouter,为了实现功能单一性,只扩充了controller跳转的功能。数据的传入通过参数传递(底层是通过依赖注入实现)。通过block只返回跳转是否成功,比如打开设置页:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[PTRouter openURL:@"" callback:^(BOOL result) {
       if (!result) {
           [SVProgressHUD showInfoWithStatus:@"打开失败"];
       }
   }];

PTRouter 支持同步 & 异步获取返回值,其中异步转同步内部通过semaphore实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ (void)openURL:(NSString *)url callback:(void (^)(BOOL result))callback;
+ (BOOL)openURL:(NSString *)url;

另外openURL除了支持url中带参数,也支持参数放在字典中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+ (void)openURL:(NSString *)url param:(NSDictionary<NSString*,id> * __nullable)param callback:(void (^)(BOOL result))callback;
+ (BOOL)openURL:(NSString *)url param:(NSDictionary<NSString *,id> * __nullable)param;
3、公共组件例如:第三方分享,数据统计,Bug分析等需要在app进入时就注册的,个人觉得应该放在工程主干中进行对应注册管理:

PTAppLaunchHelper APP启动时触发自动注册组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[PTAppLaunchHelper.shared autoInitModule];//根据AutoInitialize.plist 自动初始化组

对应注册信息集中写在plist中,这样做一目了然,便于维护管理。个人使用runtime来动态注册组件。 PTAppLaunchHelper有两个函数:

  • autoInitModule 用来初始化组件。该函数会读取AutoInitialize.plist中的classes,通过runtime自动初始化协议完成初始化:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//init modules with AutoInitialize
- (void)autoInitModule;
  • autoRegistURL 用来自动注册路由,该函数会读取AutoRegistURL.plist完成路由注册。其中controller代表类名,params代表默认参数,如果openURL传的参数与默认参数不符合,路由会报错
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//init url with AutoRegistURL
- (void)autoRegistURL;

PTAppEventBus 生命周期监听组件 PTAppEventBus通过接收系统通知来获取app生命周期事件,收到生命周期事件后改变对应属性的值。默认提供了didEnterBackground等八个属性,可以使用响应式函数来监听。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)observeWithBlock:(PTObservingBlock)block {
 
   if (self.owner && self.keyPath) {
       [self.owner addObserver:self.owner forKey:self.keyPath withBlock:block];
   }
   else {
       NSLog(@"owner =  %@, keypath = %@",self.owner,self.keyPath);
       NSString *reason = [NSString stringWithFormat:@"Object does not set owner or keypath"];
       @throw [NSException exceptionWithName:NSInvalidArgumentException
                                      reason:reason
                                    userInfo:nil];
 
       return;
   }
}

PTAppEventBus使用前需要调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)start;

如果这些不够,需要监听更多的事件(例如app横竖屏状态),可以通过分类给PTAppEventBus的添加对应属性属性,操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSMutableDictionary *defaultMap = [NSMutableDictionary dictionaryWithDictionary:[PTAppEventBus defaultNotificationMap]];
[defaultMap setObject:KDidChangeStatusBarOrientation forKey:UIApplicationWillChangeStatusBarOrientationNotification];
[PTAppEventBus.shared startWithNotificationMap:defaultMap];//开启EventBus,开启后组件可收到App生命周期事件

总结:

本文的组件通过pod 私有库进行集成。解藕部分还有待改进,后续有时间会继续修改。

原文地址

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS 组件化之路由设计思路分析
前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构。更换适合业务的架构,是为了后期能更好的维护项目。 但是用户依旧不满意,继续对开发人员提出了更多更高的要求,不仅需要高质量的用户体验,还要求快速迭代,最好一天出一个新功能,而且用户还要求不更新就能体验到新功能。为了满足用户需求,于是开发人员就用H5,ReactNative,Weex等技术对已有的项目进行改造。项目架构也变得更加的
xiangzhihong
2018/01/26
2.8K0
iOS 组件化 —— 路由设计思路分析
随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构。更换适合业务的架构,是为了后期能更好的维护项目。
一缕殇流化隐半边冰霜
2018/08/30
1.1K0
iOS 组件化 —— 路由设计思路分析
iOS组件化设计与开发
首先我觉得”组件”在这里不太合适,因为按我理解组件是指比较小的功能块,这些组件不需要多少组件间通信,没什么依赖,也就不需要做什么其他处理,面向对象就能搞定。而这里提到的是较大粒度的业务功能,我们习惯称为”模块”,指较大粒度的业务模块。
進无尽
2018/12/07
1.5K0
iOS 组件化-路由解耦思想 JLRoutes 实战篇(一)App内控制器跳转
此篇文章偏向实战, 想深入学习 Router 思想的推荐霜神写的 iOS 组件化 —— 路由设计思路分析。
前端小tips
2021/12/07
1.8K0
iOS 组件化-路由解耦思想 JLRoutes 实战篇(一)App内控制器跳转
解读 iOS 组件化与路由的本质
虽然 iOS 组件化与路由的话题在业界谈了很久,但是貌似很多人都对其有所误解,甚至没搞明白“组件”、“模块”、“路由”、“解耦”的含义。
波儿菜
2019/05/31
1.3K0
iOS组件化解决方案
由于近期迭代周期变长,有时间想想代码持续改进的问题,再加上各业务模块代码从去年杂乱无章的状态,到目前整体结构基本清晰,进而想到了模块之间解耦的问题,于是有了本文,关于iOS组件化的一些思路及最终的解决方案。
iOSSir
2023/03/19
7890
iOS组件化解决方案
【iOS开发】iOS路由引入及遇到的问题
路由是指根据url分配到对应的处理程序,在移动端就可以理解为,根据给定的url跳转到指定页面的功能模块。
吴老师
2018/09/05
1.9K0
【iOS开发】iOS路由引入及遇到的问题
Weex 是如何在 iOS 客户端上跑起来的
2016年4月21日,阿里巴巴在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请。Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。
一缕殇流化隐半边冰霜
2018/08/30
2.1K0
Weex 是如何在 iOS 客户端上跑起来的
BeeHive —— 一个优雅但还在完善中的解耦框架
BeeHive是阿里巴巴公司开源的一个iOS框架,这个框架是App模块化编程的框架一种实现方案,吸收了Spring框架Service的理念来实现模块间的API解耦。
一缕殇流化隐半边冰霜
2018/08/30
3.1K0
BeeHive —— 一个优雅但还在完善中的解耦框架
打造完备的iOS组件化方案:如何面向接口进行模块解耦?
作者 | 黑超熊猫zuik,一个修行中的 iOS 开发,喜欢搞点别人没搞过的东西,钻研过逆向工程、VIPER 架构和组件化。
用户2932962
2019/08/06
8.1K0
打造完备的iOS组件化方案:如何面向接口进行模块解耦?
蘑菇街、滴滴、淘宝、微信的组件化架构解析,附源码Demo和PDF
随着移动互联网的不断发展,很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了,很多都面临着重构的问题。
搜云库技术团队
2019/09/25
3K0
蘑菇街、滴滴、淘宝、微信的组件化架构解析,附源码Demo和PDF
有赞移动 iOS 组件化(模块化)架构设计实践
业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移动团队自 16 年起也在不断尝试各种组件化方案,在有赞微商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出 iOS 相关框架 Bifrost (雷神里的彩虹桥 https://github.com/youzan/Bifrost )。在过程中我们深刻体会到“没有绝对正确的架构,只有最合适的架构”这句话的意义。很多通用方案只是组件化的冰山一角,实际落地过程中还有相当多的东西需要考量。 本文并不准备对组件化架构设计方案给出一份标准答案,而是希望通过我们的实践经验和思考分析,提供一种思路,对遇到类似问题的同学能有所启发。
有赞coder
2020/08/25
1.4K0
有赞移动 iOS 组件化(模块化)架构设计实践
弱符号实现 iOS 组件化解耦
今天在重温《程序员的自我修养》中关于符号表的章节时,突然脑子灵光一现,想到了这个知识的一个应用场景,所以便有了这篇文章。
波儿菜
2019/11/19
1.1K0
iOS 无侵入埋点组件总结
根据标识来识别每一个事件, 针对指定的事件进行取参埋点。而事件的标识与参数信息都写在配置表中,通过动态下发配置表来实现埋点统计。
网罗开发
2021/08/13
3.8K0
iOS JLRoutes 使用
目前很多解耦方案,因为项目不算很大,所以选择了JLRoutes这种方式 首先封装了一个中间层,代码如下
赵哥窟
2019/03/01
2K1
iOS 路由改进
之前写过一篇关于iOS 组件化之CTMediator的文章,小项目中使用起来还是不怎么方便,改进了下,取名为DRouter吧,目录结构是这样的
赵哥窟
2021/04/26
6670
iOS 路由改进
大话大前端时代(一) —— Vue 与 iOS 的组件化
今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开发人员既写前端又写 Java 的 Velocity 模板而得来,不过现在大前端的范围已经越来越大了,包含前端 + 移动端,前端、CDN、Nginx、Node、Hybrid、Weex、React Native、Native App。笔者是一名普通的全职 iOS 开发者,在接触到了前端开发以后,发现了前端有些值得移动端学习的地方,于是便有了这个大前端时代系列的文章,希望两者能相互借鉴优秀的思想。谈及到大前端,常常被提及的话题有:组件化,路由与解耦,工程化(打包工具,脚手架,包管理工具),MVC 和 MVVM 架构,埋点和性能监控。笔者就先从组件化方面谈起。网上关于前端框架对比的文章也非常多(对比 React,Vue,Angular),不过跨端对比的文章好像不多?笔者就打算以前端和移动端(以 iOS 平台为主)对比为主,看看这两端的不同做法,并讨论讨论有无相互借鉴学习的地方。
一缕殇流化隐半边冰霜
2018/08/30
8910
大话大前端时代(一) —— Vue 与 iOS 的组件化
iOS开发中支付宝支付的集成(其实很简单)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/77865207
用户1451823
2018/09/13
8590
扒虫篇-崩溃日志解读及Crash收集
崩溃是让发人员比较头痛的事情,app崩溃了,说明代码写的有问题,这时如何快速定位到崩溃的地方很重要。调试阶段是比较容易找到出问题的地方的,但是已经上线的app并分析崩溃报告就比较麻烦了。最终,我们可以通过iOS崩溃日志在大多数情况下,你能从中了解到关于闪退的详尽、有用的信息。线上崩溃可以通过 iTunesConnect 中心的Cash收集,也可以通过第三方Cash收集工具,亦或自己在工程中手动收集崩溃日志上传到服务器中,本文做个小结,希望对初入者能有些帮助。
進无尽
2018/09/12
3.2K0
扒虫篇-崩溃日志解读及Crash收集
iOS WebView 的 Hybrid 框架设计
随着移动互联网的发展,APP 开发模式也在不断的创新,从最初的 Native 开发到后来的 Hybrid 混合开发,再到最近比较火爆的 React Native、Weex 等项目,这些都标志着 APP 开发已经不再是纯 Native 的工作,还要涉及很多跨平台的技术。
前端黑板报
2018/12/24
1.9K0
相关推荐
iOS 组件化之路由设计思路分析
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档