iOS模块化方案及实施
Posted AggrxTech
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS模块化方案及实施相关的知识,希望对你有一定的参考价值。
into the keychain.you started we need to ask a few questions, this should only take a minute.
https://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and click links to open a browser. )
you want to use?? [ ios / macOS ]
>
you want to use?? [ Swift / ObjC ]
> objc
> > none
view based testing? [ Yes / No ]
> no
> NTY
this project from now on.
dependency from the Podfile and total pod installed.
to your Podfile.
Ace! youWe will you off by opening your project Xcode
open
@ @ @ @ : (((((([[[[ ;
;
(
(
|
// 资源
// public 头文件
// 系统库
// 依赖
NOTE | url: The URL (https://github.com/author/******) is not reachable.
NOTE | xcodebuild: note: Using new build system
NOTE | xcodebuild: note: Building targets parallel
NOTE | xcodebuild: note: Using codesigning identity override: NOTE | xcodebuild: note: Build preparation complete
NOTE | [iOS] xcodebuild: note: Planning build
NOTE | [iOS] xcodebuild: note: Analyzing workspace
NOTE | [iOS] xcodebuild: note: Constructing build description
--spec-sources=https://github.com/author/******.git,https://github.com/CocoaPods/Specs.git
# 选项说明
--force
# 强制覆盖之前已经生成过的二进制库
--embedded
# 生成静态.framework
--library
# 生成静态.a
--dynamic
# 生成动态.framework
--bundle-identifier
# 动态.framework是需要签名的,所以只有生成动态库的时候需要这个BundleId
--exclude-deps
# 不包含依赖的pod库的符号表/依赖的pod库不打包进去。生成动态库的时候不能使用这个命令,动态库一定需要包含依赖的符号表。
--configuration
# 表示生成的库是debug还是release,默认是release 。
例如:--configuration=Debug,ONLY_ACTIVE_ARCH=NO
--no-mangle
# 表示 Do not mangle symbols of depedendant Pods,当你的项目依赖包含静态库时,
不加上这句,就会打包失败:
[!] podspec has binary-only depedencies,mangling not possible.
--subspecs
# 如果你的pod库有subspec,那么加上这个命名表示只给某个或几个subspec生成二进制库,
# --subspecs=subspec1,subspec2。生成的库的名字就是你podspec的名字,
# 如果你想生成的库的名字跟subspec的名字一样,那么就需要修改podspec的名字。
# 这个脚本就是批量生成subspec的二进制库,每一个subspec的库名就是podspecName+subspecName。
--spec-sources
# 一些依赖的source,如果你有依赖是来自于私有库的,
# 那就需要加上那个私有库的source,默认是cocoapods的Specs仓库。
# --spec-sources=private,https://github.com/CocoaPods/Specs.git。
打包完成会生成NTYBase-0.1.0文件夹,不推荐使用--library生成.a静态库,还需要把头文件整理到一起才能对外提供。
4. 总结模块化对于开发效率提升、改善工程稳定性都具有重要作用。模块拆分在作者看来是维持单位代码规模的手段,尽管在工程中通过把不同业务功能划成不同的组,分配给不同的开发者实现,但缺少规范的限制,由于各种原因会导致模块间耦合日益加深,久而久之无论是Bug修复还是功能升级的开发和测试成本都会增加。
模块化的另一个重要目的就是代码复用,很多基础功能实际上都能从成熟的项目中复用到新项目当中,按照需要copy&paste显然效果有限,这些功能如果出现Bug修复、实现优化就很难同步到所有项目当中。
上述问题都是模块拆分交给专业的工具的原因。本文是模块化实践的一些基础内容,还有很多细节欢迎留言讨论。
8.项目进阶
1.后台功能开发顺序及实施步骤
后台各模块的顺序如下:
切实可行的具体方案
商品分类管理为例说明
流程:
ü 确定目标
ü 分析业务逻辑
ü 编写代码实现
ü 测试
具体的实施方案如下:
总结:11163,一个模块,对应的一张表、一个模型,一个控制器,六个方法,三个视图。
具体编写如下:
一张表
2.商品分类管理
(1).明确目标
完成商品分类的增删改查操作
感性的认识一下
添加
显示
编辑
(2).业务逻辑
所谓的业务逻辑就看两个内容,表结构和表间关系
a.表结构
parent_id,父分类的id,
cat_des,分类描述
unit:分类的描述单位,服装,件,书籍,本,手机,部
sort_order:人为的排序依据
is_show:是否显示
重点是parent_id,父分类的id,用于表示分类之间的关联。
这个分类其实就是无限分类。--- 重点
所谓无限分类,就是给定一个分类,我们可以无限制的添加后代分类。
要实现无限分类,需要从两个方来考虑:
ü 表的设计 -- parent_id,
ü 程序的实现 --- 递归思想(难)
其实还有一种方案,不用递归思想,暂时不提。
具体的理解
b.表间关系
处在父表的位置,暂时不予考虑,但是一旦实现子表对应的功能之后,还是需要考虑它们之间的关联。
(3).添加分类
第一步,显示添加界面
代码如下:
第二步,入库操作
在编写代码之前,需要确保表单属性的正确性,主要有两个内容:
ü 表单的action属性
ü 表单域中的name属性,尽量和表字段保持一致
然后,编写代码如下:
对应的模型如下:
添加数据如下:
接下来,需要在顶级分类下面添加子分类,如何实现
在addAction中编写代码如下:
模型中对应的方法定义如下:
然后,在视图页面中输出分类信息
再继续添加数据如下:
怎么关联的,看html代码结构,如下:
(4).显示分类
首先,看一下最终效果
其次,分析业务逻辑如何来实现呢
分步完成
第一步,显示所有的分类信息
在indexAction中编写代码如下:
然后,在视图页面cat_list.html中遍历输出,如下:
显示效果如下:
第二步,对分类信息重新排序
具体如何实现呢?
先看一个简单的demo,还是以省市区为例说明
流程图如下:
编写代码实现:
初步代码如下:
结果是这样的,只有顶级地区,
原因是使用了局部变量,又没有很好的处理返回值。
试图使用全局变量来解决
结果ok,但这个代码不实用。
使用静态变量即可。
Static是有副作用的,使用的时候小心。(由于静态变量是常驻内存的,如果在一个动作中使用多次,则会出现叠加[重复]的情况)
在商品分类中使用tree方法完成分类的重新排序
在模型当中定义tree方法
然后在getCats方法中应用它,
其他不变, 结果如下:
结果是ok 的,但是显示的不是特别的清晰,需要按照层级来缩进。
第三步,按层级缩进
如何表示每个分类的层级。
解决方案有两种:
ü 在表中增加一个字段表示层级
ü 在tree方法处理过程中,增加一个内容,表示层级
此处,使用第二种方案,代码如下:
然后,在视图页面中,通过level来输出对应的空格(TAB)
把这个效果应用到添加分类的地方,如下:
效果如下:
5).编辑[修改]分类
第一步,显示编辑表单页面
注意,在显示的时候,一定要获取当前这个分类的信息,并展示到当前编辑的页面中。
编辑的url如下:
所以,在控制器中编写代码如下:
在视图中编写代码如下:
第二步,完成更新操作
在编写代码之前,确保两个事情
ü Action属性
ü 传递cat_id
具体编写代码如下:
做一些测试,如下:
数据消失了,根本就不显示,why?
查看数据库,
数据都还在,只不过在遍历的时候,无法查找出来。
原因:将当前分类或当前分类的后代分类作为其上级分类
分析原因如下:
结论:我们在完成具体功能的时候,还要考虑具体的业务逻辑。保证整体数据的完整性。
目标:在更新的时候不能将当前分类或当前分类的后代分类作为其上级分类
解决方案有两种:
ü 在显示上级分类的时候,将自己及其后代分类剔除掉。
ü 在更新操作之前,做一个判断。
此处,我选第二种。
给定一个分类,需要找出其所有后代分类的cat_id,同时也包括它自己,以数组的形式返回。
在模型中定义一个方法,获取指定分类的后代分类的cat_id
然后在控制器中调用该方法:
(6).删除分类
删除的入口:
在删除的时候,需要提示是否删除,以防止误操作
编写代码如下:
测试之
当删除的分类还有后代分类的时候,结果后代分类不显示了,why?
所以,在删除的时候也需要判断,如果当前分类有后代分类,需要额外处理,
解决方案有两种:
ü 将当前及后代分类一并删除,暴力法
ü 提示,如果当前分类有后代分类,不允许删除,请先删除子分类,温柔法
此处,我选择温柔法。
编写代码如下:
总结:
Mvc三板斧,一般是先写控制器,接着载入视图,然后编写模型。
重点是对业务逻辑的理解。
一个中心,两个几点
业务逻辑是中心,两个基本点是mvc和oop。
写代码的时候一定要细心、思考。
任务:
ü 商品分类管理
ü 品牌管理
ü 后台登录管理
友情提示:不要写基础类
以上是关于iOS模块化方案及实施的主要内容,如果未能解决你的问题,请参考以下文章