iOS组件化避坑心得现在市面上的组件化方案很多,各大公司各种高大上的落地方案。我在小公司的业务间隙,抽时间写的这篇简单的

组件化一般是把工程分层拆成不同的组件,以达到解耦,模块复用,便于单元测试,编译速度优化等效果,最终目的是为了提高开发质量和效率。当然,组件化是有一定成本的,在组件化之前要考虑清楚当前的项目情况是否适合组件化,收益能否覆盖开发成本。规模较小,模块没太多复用需求的项目,就没必要进行组件化。

分层后,一般使用Cocoapods来封装组件,通过路由来进行不同业务模块间的解耦调用。其中系统框架层,公有pod库层是本来就有的。其它层的拆分逻辑分别是:

cocoapods只支持在Podfile中以path方式依赖pod,在podspec中是不支持的,所以本地pod最多只能有一层。(你也可以写插件支持多层)

这样分层后,当有新的业务需求时,我们只需要创建一个本地pod,写入pod依赖,就可以快速的进入业务开发状态,因为没有其它模块的干扰,编译和调试的速度会得到极大的提升,同时也避免了模块之间的耦合。

通过上述内容,可以知道有三种类型的组件:公有pod,私有pod,本地pod。不管什么类型,都建议使用podlibcreatePodName命令来创建组件,在它生成的组件模版基础上,可以很方便的进行开发。

#因为依赖的静态库不支持模拟器arm64架构,设置当前这个pod不支持arm64,以避免podliblint无法通过s.pod_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}#单纯设置pod_target_xcconfig只是设置当前这个pod不支持arm64,这里把这些pod的上层设置为不支持arm64,兼容这种问题s.user_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}对于公有pod,负责任的做法是没有任何错误和警告后再进行发布,如果由于各种客观原因,实在无法去除警告,可以加入--allow-warnings参数来推送:podtrunkpush[NAME.podspec]--allow-warnings。如果添加--skip-import-validation参数来逃避验证,则显得有些不负责任了。

另外,在CocoaPods的1.8版本,将默认的specrepo设为了CDN源,以提高pod的速度。刚发布的公有pod版本,可能要几个小时后才能被同步到CDN源,导致刚发布时调用podinstall--repo-update没法找到新发布的pod库,这时可以通过指定源来解决这个问题,样例如下:

私有pod一般通过私有repo来进行管理,这样才方便做版本管理和使用缓存。私有repo创建命令是podrepoaddREPO_NAMESOURCE_URL,其中SOURCE_URL就是私有repo的git地址。创建私有repo后,通过podrepopushREPO_NAMESPEC_NAME.podspec命令来发布私有pod到私有repo。需要注意的是私有pod和公有pod的发布命令并不一样,分别是:

#公有pod发布命令podtrunkpushSPEC_NAME.podspec#私有pod发布命令podrepopushREPO_NAMESPEC_NAME.podspec发布后,需要在Podfile中加入私有repo源,才能找到私有pod并安装成功。

如果私有pod中依赖了非公有源的pod,在podliblint时会出现这类报错:

本地pod与主工程一起被同一个git仓库管理,不需要单独进行版本管理,也不需要push,而是在Podfile中直接以path的方式进行引入,样例如下:

#---Podfile文件中--pod'你的本地pod',:path=>'../本地pod路径/你的本地pod目录名'Pod组件中使用资源的坑在pod中,经常会出现需要使用图片,xib,json文件等资源的场景,建议使用resource_bundles来配置使用这些资源,以名为DTVideo的pod库为例:

#--DTVideo.podspec文件中--s.resource_bundles={'DTVideoAssets'=>['DTVideo/{Assets,Classes}/**/*.{xib,xcassets}']}这样配置后,cocoapods会自动把这些资源打包成一个名叫DTVideoAssets的bundle文件,在pod中使用这些资源的方式会发生一些改变。假如这个pod中有一个类VideoPlayListCell.swift,那么我们可以创建辅助方法:

structDTVideoCommon{staticfuncassetsBundle()->Bundle{letmyBundle=Bundle(for:VideoPlayListCell.self)letpath=myBundle.path(forResource:"DTVideoAssets",ofType:"bundle")guardletpath=pathelse{returnnil}letassetsBundle=Bundle.init(path:path)returnassetsBundle}staticfuncimageWith(namedname:String)->UIImage{letassetsBundle=assetsBundle()letimage=UIImage.init(named:name,in:assetsBundle,compatibleWith:nil)returnimage}}加载图片时:

letimage=DTVideoCommon.imageWith(named:"video_play_max_nor")imageView.image=image使用xib时:

letcellNib=UINib.init(nibName:cellIdentifier,bundle:DTVideoCommon.assetsBundle())tableView.register(cellNib,forCellReuseIdentifier:cellIdentifier)xib文件中设置Module名的坑xib文件中有Module设置,如果是在工程中创建的,那么它默认是勾选上inheritModuleFromTarget,当将这个文件移动到pod中时,它的Module名就被设置成了默认名,即bundle名,这样会导致创建这个cell的时候报错:

正确的设置是不要勾选inheritModuleFromTarget,并且在Module栏输入正确的Module名。

当然你也可以空着,不输入Module名,但是这样需要修改VideoPlayListCell的类名:

@objc(VideoPlayListCell)//Module栏空着情况下,必须添加这行classVideoPlayListCell:UITableViewCell{ //...代码省略}如果不使用@objc(VideoPlayListCell)修改类名,那么会出现上面一样的报错,所以还是建议输入正确的Module名

这个和pod没有关联,是主工程的混编用法。

图示的module.modulemap指的是需要import不同framework的module,例如Apod中的swift文件需要引用Bpod中的.h/.m文件,需要:importB

struct默认生成的初始化方法是internal级别的,例如:

publicstructTestStruct{letkey:String}functest(){TestStruct(key:"aaaa")}它可以在pod里面调用,但是在pod外部被调用则会报错:'TestStruct'initializerisinaccessibledueto'internal'protectionlevel。需要手动创建它的publicinit方法。如:

publicstructTestStruct{letkey:String//需要手动添加publicinit方法publicinit(key:String){self.key=key}}设置pod库的PublicHeaders和PriveteHeaders构建产物为Framework的情况下如果podspec里未标注Public和Private的时候,会将所有文件设置为Public类型,并放在Header中。

不论podspec里如何设置public_header_files和private_header_files,相应的头文件都会被设置为Project类型。

现在常见的路由方案有:URLRoute,Protocol-Class,Target-Action等。个人偏爱URLRoute,主要有两方面的原因:

而Protocol-Class,Target-Action这些方案,没法避免硬编码,只能说是URLRoute的一种补充。URLRoute本质上就是约定一个各端通用的协议,在各端内部对协议进行正确的解析和逻辑处理。封装好了之后,不管是外部还是内部的调用者,不需要关心任何细节和区分平台,只需要传入协议就可以。综上所属,推荐使用URLRoute。

组件化后会多出很多重复简单的操作,例如一个私有pod的新版本发布,需要的流程有:gitcommit->打tag->pod验证->pod发布,这些都是可以通过编写脚本简化操作的,建议在组件化过程中多做这方面的工作。

THE END
1.有哪几种类型以上四种类型的分类方法不仅适用于性格分类,还可以应用于其他领域。比如在项目管理中,可以将项目按照四种类型进行分类,分别代表不同的项目特点和需求。这种分类方法有助于我们更好地理解和应对不同类型的项目挑战。总之,将事物分为四种类型是一种简单而有效的分类方法。通过了解和应用这四种类型,我们可以https://zhidao.baidu.com/question/508029094909875764.html
2.怎么去分辨不同类型1. 确定分类标准:首先,我们需要确定一个合适的分类标准,以便将不同类型进行分类。分类标准可以是任何与所要分辨的对象相关的属性或特征。 2. 收集信息:接下来,我们需要收集关于不同类型的信息。这可以通过阅读相关文献、研究报告、采访专家或进行实地调查等方式来获取。 https://baike.120ask.com/art/a1602
3.不同类型英文怎么写不同类型英语怎么说沪江词库精选不同类型英文怎么写、英语单词怎么写、例句等信息 【计】 distinguished type 翻译推荐 使不同diversify 不同different 不同的another 与…不同different 意见不同的dissident 不同时的asynchrono 不同反应differenti 不同程度varying 想法不同的otherwise https://www.hujiang.com/ciku/764255_-1097723018/
4.关于类型意义本身没有好坏之分,只是喜好不同。 当建筑师集体不自信的时代,寻找意义便成了首要目标。这个意义看起来是重要的,沉重的,久远的,深刻的。但其实意义本身是没有这么多形容词的。正如类型,概念,只要有其所指,意义的好坏便加注在那个概念上。任何事物都有意义,都是人赋予的意义,也就是说,意义的发生也就是丰富https://www.douban.com/note/799081627/
5.各种类型英文英语各种类型用英语怎么说翻译读音爱该疾病有各种类型。 来自柯林斯例句 2. This store stocks all types of toys. 这家商店储备各种类型的玩具. 来自《简明英汉词典》 3. She sets up a rigorous intellectual framework to deconstruct various categories of film. 她构建了一个缜密的智识框架来解构各种类型的电影。 来自柯林斯例句 4. About https://www.iciba.com/%E5%90%84%E7%A7%8D%E7%B1%BB%E5%9E%8B/
6.不同的种类的翻译是:Thedifferenttypesof中文翻译英文意思a哈哈!我在看你 Ha ha! I am looking at you[translate] aà mon coeur seulement puis vous xin pourpre 在我的心脏然后只有您辛绯红色[translate] a8 月 In August[translate] a不同的种类 Different type[translate]http://eyu.zaixian-fanyi.com/fan_yi_9427326
7.交互设计笔记之:小分类,大学问2.把无规律的事物分为有规律的。按照不同的特点分类事物,使事物更有规律! 3.推测事物间存在的一些自然关系 其实中心意思也是在讲首先区分,其次归类。在产品设计中,分类管理这种东西总是会层出不穷的跑出来让人做抉择,他们跟导航设计似乎又有着千丝万缕的干系,好的分类设计关乎用户的感觉,检查并重视产品中的分类http://chengdu.cdxwcx.cn/article/cheesi.html
8.网络Cos和ToS和DSCPQosPHB的含义和区别以及映射反过来说,一种非工作保存的队列是可以进行流量整形的,而工作保存的队列(参考 PRIO)不能进行流量整形,因为工作保存队列无法延迟发送数据包。 2. 调度 一个调度器会对将要发送的数据包顺序进行排列或重排。 3分类 分类器能把不同类型的网络流量划分到不同的队列中去。 https://blog.csdn.net/bandaoyu/article/details/115666599
9.新手看过来(35)为何会有不同的雨刷类型没错,对于新手而言,了解雨刷不仅仅是要从选购和更换问题着手,同时你也可以了解一下关于雨刷的冷知识——为何会有不同类型的雨刷方式?不过要注意的是,本文所说的雨刷类型,并非指有骨和无骨这两类,而是要说平行式雨刷和对开式雨刷两种。 两种雨刷类型的比较https://www.pcauto.com.cn/drivers/1140/11405659.html
10.劳动合同种类聘用合同有什么不同?8、管理监督部门不同。 按照各部门的职能分工,劳动合同由人力资源和社会保障部门管理,事业单位除人力资源和社会保障部门管理外,还有分不同类型,则由不同的部门管理,学校归教育部门管理,医院归卫生健康部门管理,等等。 二、聘用合同的特征是什么? 聘用合同具有一般合同的法律特征聘用合同作为一种合同形式,具有一般合同共https://www.64365.com/zs/1476518.aspx
11.A类B类到底什意思?冷藏车温度分类解析凯普特K6冷藏车对于制冷要求更高的E、F等类别冷藏车,其运输的货物对低温更为敏感,需要在车厢内创造出适宜的温度才行,那么该类型冷藏车对冷机功率、保温厢材质以及风道要求就会越高。 这些不同类型的冷藏车,其实我们在路上更为常见的主要还是C-F类冷藏车。从使用场景来看,C类冷藏车的温度覆盖面最广,所运输的产品种类相对来说http://www.360che.com/driver/221019/175946.html
12.售后公房商品房农民动迁……社区类型大不同,精细化管理如何因目前市一级已经识别区分了售后公房社区、商品房社区、混合型社区、涉外社区、农村宅基归并社区、农民集中安置社区以及大型居住社区等7类,正在着手依据不同类型社区的特点和条件,积极推动社区分类管理。社区分类管理总的目标是创造美好生活的社区条件,要以“治标”和“治本”相结合的方法,推动多元主体的共商、共议、共https://www.jfdaily.com/news/detail?id=119360