iOS 组件化之旅之一

为什么需要组件化

  • 模块间解耦
  • 模块重用
  • 提高团队协作开发效率
  • 单元测试

项目需不需要组件化

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

如何组件化

组件化分层

请添加图片描述

  • 只能上层对依赖,不能下层对上层的依赖,因为下层是对上层的抽象
  • 项目公共代码资源下沉
  • 横向的依赖尽量少有,最好下层至通用模块,或者基础模块

组件化方案

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

  • 本地组件化:主要是通过在工程中创建library,利用cocoapods的workspec进行本地管理,不需要将项目上传git,而是直接在本项目中以framework的方法进行调用
  • cocoapods组件化:主要是利用cocoapods来进行模块的远程管理,需要将项目上传git(需要注意:这里的组件化模块分为公有库和私有库,对公司而言,一般是私有库)

本地组件化

1、创建主工程

请添加图片描述

工程结构
集成cocopods,进行本地管理:

$ cd 项目目录
$ pod init

编辑podfile,并执行pod install

2、创建组件

假设有以下几个模块:

主工程:承载主要的表层业务代码
Core:独立存在,应用加密、接口请求等敏感代码
Base:基类封装,拓展,基本的数据处理
Service:服务层,封装业务工具类,例如网络层服务、持久化服务等
Pods:三方依赖
其中,各个模块间的关系如下所示

请添加图片描述

模块间关系
下面,我们来进行模块的创建,以Core模块为例:

选择new -> project -> iOS -> Framework,新建一个模块

请添加图片描述

创建library
选择正确的Group 和 WorkSpace(这里需要注意一点:创建的library最好放在主工程根目录下,否则后续podfile执行pod install时会报错)

请添加图片描述

library与工程关联

将创建的library的Build Settings -> Mach-O Type修改为静态库 Static Library

请添加图片描述

3、主工程调用library

在CJLCore中新建一个文件,并添加如下代码

//类需要声明为public
public class CJLCoreSetting: NSObject {
    //属性需要声明为public
    public static let SCRET_KEY = "SCRET_KEY"
}

在Build Phases -> Headers -> Public中将新建的文件添加为public,这样主工程才能访问该文件

请添加图片描述

修改配置2
在主工程中,选择target -> Linked Frameworks Library中添加CJLCore,只需要build主工程,library能够自动联编

请添加图片描述

4、使用

首先import CJLCore,然后使用

请添加图片描述

使用

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

cocoapods组件化

假设我们需要在CJLCore中封装网络层代码,需要用到三方库Alamofire,在podfile中

platform :ios, '9.0'
inhibit_all_warnings!
use_frameworks!

#配置workspace路径
workspace 'Modularization.xcworkspace'

################# 三方依赖
# 公有
def workspace_pods
  pod 'SwiftyJSON'
end

# 主工程
def project_only_pods
  pod 'SnapKit'
end

#网络
def network_layer_pods
  pod 'Alamofire'
end

################# 模块
target 'CJLCore' do
  #配置libray路径
  project 'CJLCore/CJLCore.xcodeproj'
  
  workspace_pods
  network_layer_pods

end

################# 主工程
target 'Modularization' do
  
  workspace_pods
  project_only_pods
  network_layer_pods

  target 'ModularizationTests' do
    inherit! :search_paths

  end

  target 'ModularizationUITests' do

  end

end

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

请添加图片描述

组件的技术难点

组件间如何解耦?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值