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. Android Call(打电话)的基本知识详解

  2. teamviwer安装提示 Verification of your Teamviewer version failed!.

    打开cmd输入 regsvr32 c:\windows\SysWOW64\wintrust.dll 就可以了.

  3. python __all__用法

    主要是用来限定暴露的api a.py文件里面的内容 __all__ = ['major_fun'] def major_fun(): pass def assist_fun(): pass b.py ...

  4. faster-rcnn原理及相应概念解释

    R-CNN --> FAST-RCNN --> FASTER-RCNN R-CNN: (1)输入测试图像: (2)利用selective search 算法在图像中从上到下提取2000个左 ...

  5. Android 4.0以上BlurMaskFilter效果无效

    Android MaskFilter的基本使用: MaskFilter类可以为Paint分配边缘效果.        对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换.An ...

  6. lua 对表的简单序列化与反序列化

    参考文档:http://blog.csdn.net/xiaodan007/article/details/7096718 function sz_T2S(_t) local szRet = " ...

  7. Linux 查看目录大小及文件数量命令

    查看当前目录大小: [root@21andy.com]# du -sh 查看指定目录大小: [root@21andy.com]# du -sh /www/21andy.com 查看当前目录文件总数: ...

  8. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  9. struts1的配置文件详解

    要想使用Struts,至少要依靠两个配置文件:web.xml和struts-config.xml.其中web.xml用来安装Struts框架.而struts-config.xml用来配置在Struts ...

  10. 开机出现checking file system on C怎么办

    开机出现checking file system on C怎么办 | 浏览:16126 | 更新:2018-02-04 13:51 | 标签:开机 百度经验:jingyan.baidu.com 开机出 ...