iOS工程化之-组件化

背景

  • 由于大厂业务繁多,开发过程中为了业务分块儿就拆分不同的业务组件;
  • 随着业务迭代,可能有很多共性的东西,这些东西逐渐下沉为基础组件;
  • 还有一些业务之间需要很多交互,那之间组件也很多沟通,需要解决组件之间交互问题。
  • 这可以提高团队的开发效率以及单元测试

那么为了解决这些问题组件化就成了最合适的架构方案。模块间解耦、模块重⽤、提⾼团队协作、开发效率、单元测试等。


但是也有一些项目不需要组件化,对于这部分项目组件化反而是一种负担:

  • 项⽬较⼩,模块间交互简单,耦合少
  • 模块没有被多个外部模块引⽤,只是⼀个单独的⼩模块
  • 模块不需要重⽤,代码也很少被修改
  • 团队规模很⼩

大民哥带你玩转iOS组件化,其实很简单。

准备

组件化原则

  • 只能上层对下层依赖
  • 项⽬公共代码资源 下沉
  • 横向的依赖 最好下沉
  • 组件建立接口(门面模式)(面向接口编程)

组件化分层

一般分:业务模块层,通用模块层(常用控件,数据管理,分享,三方SDK等),基础模块层(底层组件)

cocoaPod准备

在这里插入图片描述

探索

创建组件

pod lib create JDDSaaSFoundation

创建完成会是一个简单的项目工程。

导入依赖

导入三方依赖(git)

.podspec文件中导入

s.dependency 'MJExtension'

导入本地依赖

Podfile文件里面导入本地路径:

target 'ZMVideoPlayer_Example' do
  pod 'ZMVideoPlayer', :path => '../'//表示当前文件路径在与Example同级的路径
  pod 'MJExtension', :path => '../../MJExtension'//表示指定当前文件 在ZMVideoPlayer文件父级的路径

  target 'ZMVideoPlayer_Tests' do
    inherit! :search_paths

    
  end
end
  pod 'ZMVideoPlayer', :path => '../'//表示

资源文件导入

.podspec文件中导入,在调用的时候image指向相应组件库ZMVideoPlayer的bundle

s.resource_bundles = {
     'ZMVideoPlayer' => ['ZMVideoPlayer/Assets/*.xcassets']
   }

组件化解耦通信

解藕是为了解决,组件之间耦合以及通信的问题

路由解藕通信

通过引入Router,构建一个Url,比如:ZMRouter://块名/方法名?参数,然后加上成功回调,失败回调。
这种方式过于依赖组件命名,随着需求迭代,组件库废弃,或者命名与添加不一致,很容易找不到通信不便于维护

+ (void)openURL:(nonnull NSString*)url
          param:(nullable NSDictionary*)param
        resolve:(nullable ZMRouterResolveBlock)resolve
         reject:(nullable JDDRouterRejectBlock)reject
{}

Mediator解藕通信

这种方式通过发送消息,给接收者,以传统的中介者管理为基础(Mediator),通过target去中心化,上浮业务功能action
以中介者设计方式封装了路由和本地,通过签名,消息慢速转发invocation响应Method(代表作:CTMediator,👍)
在这里插入图片描述

  • 这种中央管理的方式,可以解决点对点的通信。
  • 但随之也有一些问题,A与B通信,需要注册进Mediator一个分类,C与D通信同样也需要注册一个分类,对于大型项目,依赖度复杂的,可能两个业务库需要相互通信,以及存在一个库同时需要与多个库通信的,这种中央处理的方式就变得力不从心了
  • 比如JD这种一个项目关联400+组件库的,依赖以及传输数据的多样性,Mediator的管理方式会导致管理中心比较臃肿了

BeeHive解藕通信

主要面向协议,protocol - class,使用代理分发事件,解决一对多的通信

  • 首先派生AppDelegate类,模块注册,收集上下文环境,处理事件分发到Manager,由Manager通知各个模块同步事件,(代表作:BeeHive👍)

在这里插入图片描述

静态库

合并

经过我实践证明,Release版本下的真机和模拟器类型的静态库可以合并,当然Debug版本下的真机和模拟器类型的静态库也可以合并。但是,Release和Debug版本下的静态库不能互相合并

查看静态库设备支持类型:lipo -info 静态库路径

合并静态库:lipo -create 静态库1的路径 静态库2的路径 -output 要生成的静态库路径+静态库名称

使用

直接把生成的.a库拖到Xcode里面来,然后在Bulid Phases–>Link Binary With Libraries里面添加你的库

注意把头文件也导进来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☆MOON

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值