https://objccn.io/issue-1-1/

https://juejin.im/user/57ddfba4128fe10064cbb93a

把 Data Source 和其他 Protocols 分离出来,不要写在Controller中

Collection view 的datasource 和 delegate 尤为严重

  • UICollectionViewDataSource,UICollectionViewDelegate

把以下三个方法提取到其他的文件中,单独管理,可以极大程度减少Controller 的体积

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath)

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, cellOptionAtIndexPath indexPath: IndexPath)

把数据请求处理封,和数据解析装到单独的类里面

  • 减少因为网络请求,数据解析,引起的代码过多问题

把业务层展现封装一个Presenter或Handler的业务层展现处理类

  • 把一些展示相关的代码逻辑摘出来,不放在vc 中

    类似于这样的代码:
 // 获取原有数据商品数量
fileprivate func getSelectedItemCount(_ cartCombinationItem: CartCombinationItem, combinationID: Int) ->Int{
var oldSuiteCount = 0
var oldItemCount = 0
var isSuit = false
let index = getCombinationIndexWith(combinationID)
if index >= 0 && index < list?.count ?? 0{
let combination = self.list[index]
isSuit = combination.isSuit
if isSuit{
if let cartItems = combination.cartItems{
oldSuiteCount = combination.amount ?? 0
for item in cartItems{
if item.cellType == .cart_GROUP_ITEM{
oldItemCount += 1
}
}
}
}else{
oldItemCount = cartCombinationItem.amount
}
}
if ZZConstant.ISDEBUG{
print("cartCombinationItem.amount=====>\(oldItemCount)===\(oldSuiteCount)")
}
if isSuit{
return oldSuiteCount * oldItemCount
}else{
return oldItemCount
}
} func deleteCombinationCallBack(_ indexPath: IndexPath,cartCombinationItem: CartCombinationItem){ let cartCombinationItem = self.cartItemList[(indexPath as NSIndexPath).row]
let combinationID = cartCombinationItem.combinationId ?? 0
let itemCount = getSelectedItemCount(cartCombinationItem, combinationID: combinationID)
NavBarView.sendCartCountChangedNotification(-itemCount)
setCartTitle() //找到对应index,删除model数据
var selectIndex: Int = -1
for i in 0..<self.list.count {
if (self.list[i].id == combinationID){
selectIndex = i
break
}
} // bugly.qq.com/v2/crash-reporting/crashes/f98c73468f/1219?pid=2
// libswiftCore.dylib __TFVs15ContiguousArray6removefT2atSi_x_merged + 56
// 凡事涉及动态赋值的变量,还是设置为 optional 比较保险,optional 会对其进行判断,不至于崩溃
if (list != nil && list.count >= selectIndex) {
list.remove(at: selectIndex)
} //删除cell
if (selectIndex >= 0) {
//重新加载数据
requestData(true,isDeleteLoading: true, gaTrack: false)
}
} func isDeleteCombination(_ indexPath: IndexPath) {
// 弹出对话框是否删除物品
deleteIndexPath = indexPath
alertVC?.delegate = self
alertVC?.bindData("是否确定删除?", alertContent: nil, alertType: alert_type_item_del)
alertVC?.show()
}

View 的抽象整理

在view中 反复用到,或是经常变动需求变化的view, 尽量抽象出一个独立的view,形成一个单独的组件,后续的变化都在这个组件上进行变化,这样不会影响原有的业务逻辑,本身Controller的代码也会很少

这里典型的就是购买弹层,后续发现购买弹层,选型选色的那部分,其实是可以抽出一个独立的组件的,使用共同的 Model,实现同样的delegate,这样子,详情页和弹层,就可以共同使用这一个组件,而不必拷贝代码和Cell,造成代码的浪费,而且后续维护这部分逻辑需要改两个地方,两个地方的上下文和模型还不一致

iOS ViewControllers 瘦身的更多相关文章

  1. iOS代码瘦身实践

    1 分析当前ipa的组成 一般一个ipa会包含: 1) 资源文件 本地文件:数据.配置.数据库等等 字体文件 图片资源 2)  源代码 通过生成linkmap文件,分析源代码生成的编译文件的大小.在B ...

  2. iOS可执行文件瘦身方法

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  3. 【转】iOS可执行文件瘦身方法

    http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...

  4. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  5. iOS图片瘦身总结

    前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...

  6. iOS控制器瘦身-面向超类编程

    今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...

  7. iOS 可执行文件瘦身方法

    编译选项 1.编译器优化级别 Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest,这个选项会开启 ...

  8. IOS APP 瘦身

    只保留其中一宗编译环境包 lipo -thin armv7 XXAPP -output XXAPP.armv7

  9. iOS - Bitcode App 瘦身中间码

    1.Bitcode 随着 Xcode7 的发布,Apple 提供了一项新的技术来支持 App 瘦身功能,那就是 Bitcode. 1.BitCode 是什么 Bitcode is an interme ...

随机推荐

  1. YII创建应用

    创建第一个应用 打开cmd,切换到appserv的www目录下,输入: D:\AppServ\www>yii6\framework\yiic webapp D:wamp\www\mydemos

  2. okHttp3自用封装

    okHttp都已经出到3.2.0了,现在才开始要用到它,感觉自己好low~~ 根据平时自己的习惯,还是自己做一下封装,让代码撸起来更加顺畅一点! okhttp-3.2.0和okio-1.7.0就不多说 ...

  3. SpringBoot------thymeleaf的使用

    1.pom.xml添加相应依赖 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  4. 【数据分析】Superset 之三 Docker操作管理

    一.进入容器 查看运行的容器:docker ps docker attach confident_thompson 或者 docker attach 34cd2299110f docker exec ...

  5. Jsoup(四)-- Jsoup获取DOM元素属性值

    1.获取博客园的博客标题以及博客地址,获取友情链接 2.代码实现: public static void main(String[] args) throws Exception{ // 创建http ...

  6. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...

  7. AngularJS控制器和AngularJS过滤器的学习(3)

    前面简单的学习了AngularJS的表达式和指令,就可以说大概对AngularJS有了一定的了解吧,嘿嘿,下面就来总结学习一下AngularJS的控制器和过滤器哦. 说起来AngularJS控制器,其 ...

  8. GCC 编译详解[转]

    转自http://www.cnblogs.com/azraelly/archive/2012/07/07/2580839.html GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译 ...

  9. 常见微信小程序开发工具

    图标: 1.iconfont图标库:http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2

  10. C/C++注册动态对象到Lu系统并进行运算符重载

    欢迎访问Lu程序设计 C/C++注册动态对象到Lu系统并进行运算符重载 1 说明 要演示本文的例子,你必须下载Lu32脚本系统.本文的例子需要lu32.dll.lu32.lib.C格式的头文件lu32 ...