查漏补缺面试相关

OC底层面试题-组件化的创建(上)

2021-04-21  本文已影响0人  iOS鑫

前言

本来想着写界面优化的,但是因为前段时间项目比较忙,就一直没弄!加上最近项目里也在整理组件化的东西,所以也就决定写篇关于组件化的文章。


组件化

谈到组件化,首先想到的是解耦模块化。其实组件化就是将模块化抽离分层,并制定模块间通讯方式,从而实现解耦的一种方式,主要运用在团队开发

组件化的有点

组件化主要有一下有点

当项目因为各种需求,越来越大时,如果此时的各个模块之间是互相调用,即你中有我,我中有你这种情况时,会造成高耦合的情况。一旦我们需要对某一块代码进行修改时,就会造成影响范围广功能多的问题,导致项目难以维护 其问题主要体现在一下几个方面

所以为了解决以上问题,我们需要采用更规范的方式降低模块间的耦合度,然后组件化就应运而生,组件化也可以理解为模块化

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130 595 548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

组件化的适用说明

上面说了组件化的好处,但是因为组件化也是需要一定成本的,需要花费时间设计接口分离代码等,所以并不是所有的项目都需要组件化。如果你的项目有以下3个以上特征就不需要组件化

如果你的有以下3个以上特征,说明你就必须要考虑进行组件化了:

组件化方案

组件化的指标

一个项目经过组件化后如何来评判项目组件化是否彻底或者说是否优秀,可以通过以下几个方面:

前4条主要用于衡量一个模块是否真正解耦,后4条主要用于衡量在项目中实践中的易用程度

组件化原则

一般一个项目重要分为三层:业务层通用层基础层,具体如下图所示:

在进行组件化时,有一下几点需要说明:

组件化方案

目前常用的组件化方案主要有两种:

下面我们来介绍下本地组件化

本地组件化

1.创建主工程

$ cd 项目目录
$ pod init
复制代码

2.创建组件

可以创建自己的模块:

其中各个模块的关系:

下面我们进行简单的模块创建,我们以Service为例:

这里需要注意的是,子library之间的互相调用,与主工程调用library类似,主需要添加依赖暴露header即可

假设我们需要在LjComponentA中封装网络层代码,需要用到三方库Alamofire,在podfile中进行如下修改

然后pod install,成功后就可以在LjComponentA使用Alamofire库

到此,一个本地组件化的模块就配置完成了

cocoapods组件化

除了本地组件化,还可以使用cocoapods,其原理如下图所示

这里还是以本地组件化中的Service为例

创建私有仓库

具体步骤:登录github-->点击右上角“+”-->选择new repository-->输入Repository name为TestPodsComponent,选择仓库类型为private,点击Create repository

pod repo add TestPodsComponent https://github.com/xxxx/TestPodsComponent.git

创建pods 工程,即组件化工程

pod lib create TestPodsComponent

配置pods工程

修改模块的配置文件,即TestPodsComponent.podspec

s.dependency 'AFNetworking' # 依赖AFNetworking
//********1、修改 podspec 文件
s.dependency 'LjServices'

//********2、修改 podfile 文件
pod 'LjServices', :path => '../../LjServices'
//*****1、修改 podspec 文件
s.resource_bundles = {
     'LjBase' => ['LjBase/Assets/*']
   }

//*****2、使用
let bundlePath: String = Bundle.init(for: dynamicClass.self).resourcePath! + "/LjBase.bundle"
let bundle = Bundle(path: bundlePath)
if let path = bundle?.path(forResource: "mouse", ofType: "jpg"){
    self.imgView.image = UIImage(contentsOfFile: path)
} 

同理,模块中的xib,json文件的获取方式也是一样的

提交至git

这里提交至git的模块是pods工程才可以,以TestPodsComponent为例 我们刚才在git建了一个私有库:TestPodsComponent

【注意】:在执行完git add .后,最好执行下git status,查看下状态

验证podspec文件

执行终端命令pod spec lint

  • pod spec相对于pod lib精确
  • pod lib相当于只验证一个本地仓库
  • pod spec同时验证本地仓库远程仓库

加上 ----allow-warnings为了移除警告

【如果出现报错:- ERROR | [iOS] file patterns: The ’source_files‘ pattern did not match any file.】

这是由于未在cocoapos中找到相应的文件夹,可以执行以下操作

提交到私有仓库

执行以下命令:pod repo push [本地Spec Repo名称][podspec文件路径]

提交成功后,下面就可以使用了

使用

至此我们对cocoapods组件化已经完成,下篇我们要介绍下组件化之间的通信

拓展

上面我们看到TestPodsComponent.podspec内容:s.name,s.version下面我们来解释下每项都是什么意思

上一篇下一篇

猜你喜欢

热点阅读