iOS组件化之具体实现

网友投稿 753 2022-11-27

iOS组件化之具体实现

iOS组件化之具体实现

随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分。但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好的让拆分出去的业务工程能够独立运行,必须进行组件拆分并且实现组件服务化。 1.组件和组件之间没有明确的约束。 2.组件单独开发、单独测试,不能揉入主项目中开发,测试也可以针对性的测试。 由于本人的习惯,喜欢把很复杂的问题大白话化。组件是什么?它就是通过CocoaPods来管理的几个文件,它能实现特定的功能。通常它都采用的私有库和私有源,不然大伙都可以看到你的代码。当然也有的组件本来就是为了开源的,开源的库通常放在公有源上。 组件化主要为了解决不同app代码重复性问题,便于维护,其次为了代码功能清晰。当组件更新,各个app只需要执行pod update就把组件的功能代码更新了,不用每个app重新导入或修改相同的代码了。新建app只需要配置Podfile文件,执行pod update命令就能把组件导入过来大大提高了开发效率。每个组件实现特定的功能,不用在一堆业务代码中翻找不同的功能代码了,你说代码功能能不清晰吗? 组件主要分三类:基础功能组件,基础UI组件,产品业务组件  1.基础功能组件:(类似于性能统计、Networking、网络诊断、定制Categories安全处理扩展类组件等) 按功能分库,不涉及产品业务需求,跟库Library类似 通过良好的接口拱上层业务组件调用; 不写入产品定制逻辑,通过扩展接口完成定制;  2. 基础UI组件:(例如下拉刷新组件、弹出框组件、小菊花组件、选择框组件等) 产品内通用UI组件;(各个业务模块依赖使用,但需要保持好定制扩展的设计) 公共通用UI组件;(不涉及具体产品的视觉设计, 目前较少)  3. 产品业务组件:(例如支付组件、分享组件、页面管理组件、评价组件、版本更新组件、WebSocket等长连接组件) 业务功能间相对独立,相互间没有Model共享的依赖; 业务之间的页面调用只能通过UIBus进行跳转; 业务之间的逻辑Action调用只能通过服务提供; 网络组件可以只包含对AFNetworking的进一步抽象,以便于更简单的使用。它比使用扩展类写在一个文件里的可读性要强的多。几个相关的请求在一个类文件里比所有的请求都在一个类文件里,大家想像就知道那个更合理。 本文主要的内容是组件化的实现,不是讲组件化的代码具体实现的,关于组件化代码实现以后再说。 你可以这样理解,就是想把几个.h和.m等文件怎么用CocoaPods把它变成私有库,指定的成员可以-。大公司都是自己搭建的GitLab服务器。小公司大都使用的是git服务器。当然自己搭建的服务器上传-要比git服务器要快的多。本文主要以git服务器为示例,所有***需要你换成自己的路径和文件,工程名。 以前在大公司都是比人专门建立了私有源和环境,自己上传组件就可以。当了新公司要当拓荒者一个人实现组件化,遇到问题不是一般的大,一个很小的问题就卡了我两周。从零开始组件化你才能充分理解组件化的重要和本质。 下面是实现组件化的步骤。

-> ModuleManager (0.0.1)

Analyzed 1 podspec.

ModuleManager.podspec passed validation. 7. 编译检查通过,推送到私有源和私有库。例如:pod repo push *** ModuleManager.podspec --allow-warnings 注意:若是本组件需要访问私有源和公有源都需要加上。例如:pod repo push YiXiangSpec YXPayManager.podspec --sources=‘​​​--allow-warnings --use-libraries 若你的组件有几百兆(如通信基础组件),可能需要很常时间,毕竟git服务器在国外,大家耐心等待吧! 上传成功的例子 jiaguoshangdeMacBook-Air:ModuleManager jiaguoshang$ pod repo push *** ModuleManager.podspec --allow-warnings

Validating spec -> ModuleManager (0.0.2)

Updating the `***’ repo

Already up to date.

Adding the spec to the `***’ repo

[Add] ModuleManager (0.0.2)

Pushing the `***’ repo 注意:你-时,以公有源映射的库优先,其次是私有源映射的组件。由于共有源上已经有一个ModuleManager的第三方库,你若你的私有源上的这个组件也叫ModuleManager,那么你用pod update-时,-的事公有源上的那个swift版本的第三方库。 8. 在项目所在文件夹修改或创建Podfile文件,增加你的组件。 9.使用pod update更新组件,若你以前已经执行过,只是想对新加的这个三方库进行-。可以使用这个命令来提高更新速度:pod update --verbose --no-repo-update。 若有新加的组件或第三方库,需要关闭工程再打开工程才能生效。 10.若你已经-这个第三方库,有时候你使用pod update命令可能-的别人的组件是老版本的,更新不到老版本,可以先在Podfile文件中注释掉(#pod ‘MLeaksFinder’,‘0.2.1’)对应组件,再pod update --verbose --no-repo-update;再打开在Podfile文件中去掉注释,再pod update --verbose --no-repo-update就能-别人的组件的最新版本了,估计这个是本地私有源的问题。若这个库就是在本电脑更新的库,再更新现在的肯定是最新版本。

下面是包含私有源和公有源的Podfile文件例子:

Uncomment this line to define a global platform for your project

source ‘​​source ‘​​​platform :ios, “8.0” target ‘ArtEnjoymentWeChatAuction’ do

Uncomment this line if you’re using Swift or would like to use dynamic frameworks

use_frameworks!

Pods for ***

pod 'YXFDCategories'##################################第三方############################YYModel--数组转模型组件pod 'YYModel', '1.0.4'#YYCategories--给系统类添加的分类pod 'YYCategories', '1.0.4'#内存泄漏检测,正式环境需要注释下面一行pod 'MLeaksFinder','0.2.1'

end

下面是一个简单的一个只包含Classes文件夹下的.h和.m文件的组件管理组件的配置文件(ModuleManager.podspec):

Any lines starting with a # are optional, but their use is encouraged

To learn more about a Podspec see do |s|​​​s.name​​​ = ‘ModuleManager’ s.version = ‘0.0.2’ s.summary = ‘ModuleManager.’

This description is used to generate tags and improve search results.

* Think: What does it do? Why did you write it? What is the focus?

* Try to keep it short, snappy and to the point.

* Write the description between the DESC delimiters below.

* Finally, don’t worry about the indent, CocoaPods strips it!

s.description = <<-DESC TODO: Add long description of the pod here. DESC s.homepage = ‘​​​= ‘example.com/screenshots_1’, ‘example.com/screenshots_2’

s.license = { :type => ‘MIT’, :file => ‘LICENSE’ } s.author = { ‘jiaguoshang’ => ‘@163.com’ } s.source = { :git => '​​:tag => s.version.to_s }

s.social_media_url = ‘= ‘8.0’ s.source_files = 'ModuleManager/Classes/.{h,m}’ #s.source_files = “ModuleManager”, "'ModuleManager/**/.{h,m}"

s.resource_bundles = {

‘ModuleManager’ => [‘ModuleManager/Assets/*.png’]

}

s.public_header_files = ‘Pod/Classes/**/*.h’

s.frameworks = ‘UIKit’, ‘Foundation’

s.dependency ‘AFNetworking’, ‘~> 2.3’

end 下面是一个既依赖私有库又依赖公有库的配置文件(YXRequestManager.podspec):

Be sure to run `pod lib lint YXRequestManager.podspec’ to ensure this is a

valid spec before submitting.

Any lines starting with a # are optional, but their use is encouraged

To learn more about a Podspec see do |s|​​​s.name​​​ = ‘YXRequestManager’ s.version = ‘1.1.9’ s.summary = ‘YXRequestManager.’

This description is used to generate tags and improve search results.

* Think: What does it do? Why did you write it? What is the focus?

* Try to keep it short, snappy and to the point.

* Write the description between the DESC delimiters below.

* Finally, don’t worry about the indent, CocoaPods strips it!

s.description = <<-DESC TODO: Add long description of the pod here. DESC s.homepage = ‘​​​= ‘example.com/screenshots_1’, ‘example.com/screenshots_2’

s.license = { :type => ‘MIT’, :file => ‘LICENSE’ } s.author = { ‘jiaguoshang’ => ‘***@163.com’ } s.source = { :git => ‘​​​:tag => s.version.to_s }

s.social_media_url = ‘= ‘8.0’ s.source_files = ‘YXRequestManager/Classes/**/*.{h,m}’

s.source_files = ‘YXCache’, ‘YXRequestManager/Classes/YXCache/*.{h,m}’,

s.source_files = ‘AESCategory’, ‘YXRequestManager/Classes/AESCategory/*.{h,m}’

s.source_files = ‘YXRequest’, ‘YXRequestManager/Classes/YXRequest/*.{h,m}’

#s.source_files = “YXRequestManager”, "YXRequestManager/**/.{h,m}" s.resource_bundles = { ‘YXRequestManager’ => ['YXRequestManager/Classes/.xcassets’] }

s.public_header_files = ‘Pod/Classes/**/*.h’

s.frameworks = ‘UIKit’, ‘Foundation’ s.dependency ‘YXFDCategories’ s.dependency ‘AFNetworking’, ‘3.1.0’ s.dependency ‘TMCache’ end

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用RestTemplate调用https接口跳过证书验证
下一篇:图像的压缩算法--尺寸压缩、格式压缩和品质压缩
相关文章

 发表评论

暂时没有评论,来抢沙发吧~