iOS 组件化(一)

组件化

组件化就是将模块单独抽离,分层,通过制定的通讯方式,实现解耦

组件化优点
  • 模块间的解耦
  • 模块重用
  • 提交团队开发效率
  • 单元测试
需要组件化的情况
  • 各个模块之间相互引用严重,造成高耦合导致项目维护困难
  • 项目规模变大,团队人数变多,导致合并代码经常冲突
  • 项目编译耗时很长
  • 模块需要进行单元测试
不需要组件化的情况
  • 项目较小,模块简单,耦合小
  • 模块没有被多个外部模块引用,只是一个小模块
  • 团队规模小
  • 不需要进行单元测试
组件化的标准
  • 模块直接没有耦合,修改自己不会改变其他模块
  • 模块可以单独编译
  • 模块间数据传递明确,对外接口清晰易维护
  • 模块随时可以被相同功能的模块代替
  • 模块接口改变时,可以高效的重构
组件化分层

项目在进行组件化时,通常分为三层:基础层通用层业务层

  • 只能上层对下层依赖
  • 项目公共资源下沉
  • 横向依赖下沉至通用层或者基础层
组件化图示
组件化方案
  • 本地组件化:通过创建library,利用cocoapodsworkspec进行本地管理,通过framework方式直接调用
  • cocoapods组件化:将模块上传到私有库,通过cocoapods远程管理

本地组件化

1、创建主工程
  • 创建主工程
  • 集成cocoapods
  • 编辑Podfile,执行pod install
    image.png
2、创建组件

我们创建一个Base模块

  • 选择File --> new --> iOS --> Framework
Framework
  • 选择正确的WorkSpaceGroup,最好放在主工程目录下
    关联
  • 修改创建的library静态库
    静态库
3、调用library
  • 新建一个文件,并添加外部属性


    image.png
  • 将需要暴露的外部接口文件,移动到Build Phases -> Headers -> Public

    image.png

  • 在主工程下,选择target --> Build Phases --> Link Binary With Libraries,添加YPBaseModule

    image.png

  • 在主工程下,选择Target ->Build Setting -> Search Paths -> User Header Search Paths里面添加${SRCROOT}

    image.png

4、使用

**子library之间相互调用和主工程调用类似,只需要添加依赖和暴露header *

image.png
5、cocoapods管理三方依赖

platform :ios, '10.0'
use_frameworks!

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

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

# 主工程
def project_only_pods
  pod 'Masonry'
end

#网络
def network_layer_pods
  pod 'AFNetworking'
end

################# 模块
target 'YPBaseModule' do
  #配置library路径
  project 'YPProject/YPBaseModule.xcodeproj'
  
  workspace_pods
  network_layer_pods
end

################# 主工程
target 'YPProject' do
  workspace_pods
  project_only_pods
  network_layer_pods
end

cocoapods组件化

cocoapods组件化流程
1、创建私有仓库
  • 登录github --> 点击右上角+号 --> 选择new repository --> 输入仓库名字,选择仓库类型为private,点击创建
  • 将私有库添加到本地~/.cocoapods/repos目录
pod repo add TestModule https://github.com/Ymuyangyin/TextModule
2、创建工程
  • 终端创建YPServices模块
pod lib create YPServices
  • 根据提示输入


    image.png
  • 将模块代码拷贝到/YPServices/Classes目录下

    image.png

  • 执行pod install,Classes目录下的文件就会更新到pods

    image.png

3、配置
通过修改配置文件YPServices.podspec
  • 添加第三方库依赖
s.dependency 'AFNetworking'
  • 其他模块引用
//1、修改对应的podspec
s.dependency 'YPServices'
//2、修改podfile
pod 'YPServices',  :path => '../../YPServices'

  • 加载图片、xib、bundle等文件

    • 对应模块的Assets文件中添加资源文件
    • spec配置资源文件路径
      s.resource_bundles = {
       'YPServices' => ['YPServices/Assets/*']
     }
    
    • 访问模块的资源文件需要指定资源文件路径
    NSString *path = [[NSBundle bundleForClass:[YPServices class]]  pathForResource:@"Player_Video_Url" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    YPErrorView *errorView = [[[NSBundle bundleForClass:[YPServices class]]loadNibNamed:NSStringFromClass([YPErrorView class]) owner:nil options:nil] lastObject];
    
    
4、提交到git
git init

git add .

git commit -am "首次提交"
//模块仓库地址
git remote add origin https://github.com/Ymuyangyin/YPServices

git push origin master
//添加标签 版本号
git tag -m "first release" "0.1.0"

git push --tags
5、验证podspec文件
  • pod lib lint :验证本地仓库
  • pod spec lint:验证本地和远程仓库
6、提交到私有仓库
pod repo push [本地 Spec Repo名称] [podspec文件路径]
//------------
pod repo push TestModule YPServices.podspec
7、使用

打开podfile文件,添加下面指令,执行pod install

#私有spec仓库的地址,而不是某个pod仓库的地址
source 'https://github.com/Ymuyangyin/TestModule'
pod 'YPServices'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 组件化流程 准备了解工作: 什么是组件化?适合什么样的场景?组件化其实就是将我们的业务代码或者一些基础支撑代码变成...
    会飞的大马猴阅读 1,945评论 6 9
  • 最近在学习vue.js的时候发现,vue的组件化的思想对于编写代码是一个非常有用的事情。 首先为什么需要组件化? ...
    helloWalle阅读 2,699评论 0 6
  • 目录一、基础使用创建私有的pod索引仓库创建网络模块LeelenNetwork私有库使用注意事项二、依赖第三方库三...
    枫叶情结阅读 7,310评论 0 12
  • 前述 体验过牵一发而动全身,编译5分钟之后,每次发版本都要被测试一顿臭骂之后。组件化的心愈发强烈。网上大多数关于组...
    hansfeng阅读 3,880评论 1 34
  • 组件化简介 想要做组件化的前提当然得知道什么是组件化。顾名思义,组件化就是将APP拆分成各个组件(或者说模块也行)...
    Gui晨曦遇晓阅读 9,440评论 9 46