[关闭]
@buoge 2017-08-29T11:07:38.000000Z 字数 2727 阅读 1008

ViewControllers 瘦身

iOS


https://objccn.io/issue-1-1/
https://juejin.im/user/57ddfba4128fe10064cbb93a

image_1bolv7h6g13fv2a3suq1b561cpi9.png-322.2kB

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

Collection view 的datasource 和 delegate 尤为严重
* UICollectionViewDataSource,UICollectionViewDelegate

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

  1. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath)
  2. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
  3. func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, cellOptionAtIndexPath indexPath: IndexPath)

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

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

  1. // 获取原有数据商品数量
  2. fileprivate func getSelectedItemCount(_ cartCombinationItem: CartCombinationItem, combinationID: Int) ->Int{
  3. var oldSuiteCount = 0
  4. var oldItemCount = 0
  5. var isSuit = false
  6. let index = getCombinationIndexWith(combinationID)
  7. if index >= 0 && index < list?.count ?? 0{
  8. let combination = self.list[index]
  9. isSuit = combination.isSuit
  10. if isSuit{
  11. if let cartItems = combination.cartItems{
  12. oldSuiteCount = combination.amount ?? 0
  13. for item in cartItems{
  14. if item.cellType == .cart_GROUP_ITEM{
  15. oldItemCount += 1
  16. }
  17. }
  18. }
  19. }else{
  20. oldItemCount = cartCombinationItem.amount
  21. }
  22. }
  23. if ZZConstant.ISDEBUG{
  24. print("cartCombinationItem.amount=====>\(oldItemCount)===\(oldSuiteCount)")
  25. }
  26. if isSuit{
  27. return oldSuiteCount * oldItemCount
  28. }else{
  29. return oldItemCount
  30. }
  31. }
  32. func deleteCombinationCallBack(_ indexPath: IndexPath,cartCombinationItem: CartCombinationItem){
  33. let cartCombinationItem = self.cartItemList[(indexPath as NSIndexPath).row]
  34. let combinationID = cartCombinationItem.combinationId ?? 0
  35. let itemCount = getSelectedItemCount(cartCombinationItem, combinationID: combinationID)
  36. NavBarView.sendCartCountChangedNotification(-itemCount)
  37. setCartTitle()
  38. //找到对应index,删除model数据
  39. var selectIndex: Int = -1
  40. for i in 0..<self.list.count {
  41. if (self.list[i].id == combinationID){
  42. selectIndex = i
  43. break
  44. }
  45. }
  46. // bugly.qq.com/v2/crash-reporting/crashes/f98c73468f/1219?pid=2
  47. // libswiftCore.dylib __TFVs15ContiguousArray6removefT2atSi_x_merged + 56
  48. // 凡事涉及动态赋值的变量,还是设置为 optional 比较保险,optional 会对其进行判断,不至于崩溃
  49. if (list != nil && list.count >= selectIndex) {
  50. list.remove(at: selectIndex)
  51. }
  52. //删除cell
  53. if (selectIndex >= 0) {
  54. //重新加载数据
  55. requestData(true,isDeleteLoading: true, gaTrack: false)
  56. }
  57. }
  58. func isDeleteCombination(_ indexPath: IndexPath) {
  59. // 弹出对话框是否删除物品
  60. deleteIndexPath = indexPath
  61. alertVC?.delegate = self
  62. alertVC?.bindData("是否确定删除?", alertContent: nil, alertType: alert_type_item_del)
  63. alertVC?.show()
  64. }

View 的抽象整理

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

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注