文档章节

项目总结(个人,还在不断更新中)

麦兜卖鱼丸
 麦兜卖鱼丸
发布于 2016/05/20 14:11
字数 900
阅读 113
收藏 4

前言

我认为,进步不仅仅是取决于你不断的在行走,有时候停下来,整理整理思路,总结之前所遇到的困难,也是一种进步。善于总结,发现以前的不足,然后想办法解决他,这个过程就是进步的开始,我不认为做得多就一定成长快,但是,做了不去思考肯定是成长不了的,只能说是一直在原地踏步。当然这样的工作你需要不断的去摸索,然后得到一套自己觉得合理的项目模块分类,让项目变得易扩展、易维护。

 

个人理解(一)创建合理的工具类--  项目做到一定的程度,多多少少会有很多的代码冗余。或者不是说代码冗余,而是代码复用性不高,不同的地方重复的代码很多;就比如说设置字体颜色,这个那个客户端都是必不可少的,有的人使用#define kColor [UIColor whiteColor]预先定义好颜色,但是这样内容多的话,不会美观,这时候我们可以创建一个颜色工具类(UIColor+Utils)如下图;

我个人的理解是能用category创建工具类的尽量用,如果都是用继承NSObject来创建的话,到最后内容多的话,代码会很多,不利于维护;更多的工具类如下(借鉴,用于举例说明);

等等。

 

个人理解(二)通用的模板--   其实大家不难发现,很多界面的布局都可以使用UITableView这个控件进行布局。如果是单纯的列表页面,可以创建一个共用的BaseTableViewController,用于控制请求后台接口的操作、上拉或者下拉刷新的操作等等,而子控制器负责加载显示数据等等。比如说一下的代码;

#pragma mark - 请求数据

- (void)fetchObjectsOnPage:(NSUInteger)page refresh:(BOOL)refresh
{
    [_manager GET:self.generateURL(page)
      parameters:nil
         success:^(AFHTTPRequestOperation *operation, ONOXMLDocument *responseDocument) {
             _allCount = [[[responseDocument.rootElement firstChildWithTag:@"allCount"] numberValue] intValue];
             NSArray *objectsXML = [self parseXML:responseDocument];
             
             if (refresh) {
                 _page = 0;
                 [_objects removeAllObjects];
                 if (_didRefreshSucceed) {_didRefreshSucceed();}
             }
             
             if (_parseExtraInfo) {_parseExtraInfo(responseDocument);}
             
             for (ONOXMLElement *objectXML in objectsXML) {
                 BOOL shouldBeAdded = YES;
                 id obj = [[_objClass alloc] initWithXML:objectXML];
                 
                 for (OSCBaseObject *baseObj in _objects) {
                     if ([obj isEqual:baseObj]) {
                         shouldBeAdded = NO;
                         break;
                     }
                 }
                 if (shouldBeAdded) {
                     [_objects addObject:obj];
                 }
             }
             
             if (_needAutoRefresh) {
                 [_userDefaults setObject:_lastRefreshTime forKey:_kLastRefreshTime];
             }
             
             dispatch_async(dispatch_get_main_queue(), ^{
                 if (self.tableWillReload) {self.tableWillReload(objectsXML.count);}
                 else {
                     if (_page == 0 && objectsXML.count == 0) {
                         _lastCell.status = LastCellStatusEmpty;
                     } else if (objectsXML.count == 0 || (_page == 0 && objectsXML.count < 20)) {
                         _lastCell.status = LastCellStatusFinished;
                     } else {
                         _lastCell.status = LastCellStatusMore;
                     }
                 }
                 
                 if (self.tableView.mj_header.isRefreshing) {
                     [self.tableView.mj_header endRefreshing];
                 }
                 
                 [self.tableView reloadData];
             });
         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             MBProgressHUD *HUD = [Utils createHUD];
             HUD.mode = MBProgressHUDModeCustomView;
             HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"HUD-error"]];
             HUD.detailsLabelText = [NSString stringWithFormat:@"%@", error.userInfo[NSLocalizedDescriptionKey]];
             
             [HUD hide:YES afterDelay:1];
             
             _lastCell.status = LastCellStatusError;
             if (self.tableView.mj_header.isRefreshing) {
                 [self.tableView.mj_header endRefreshing];
             }
             [self.tableView reloadData];
         }
     ];
}

统一的去管理tableview的刷新数据的操作。而子控制器需要做的就是配置需要访问的接口API以及其他是否自动刷新的属性的设置。

 

个人理解(三)网络层的封装--   网络层对于所有后台数据交互的客户端都是必不可少的,对于第三方AFNetworking,原本的API复用性不强,需要我们自己再次封装,当然是根据我们的业务需求来决定。就比我说我的一个项目的一个POST请求的封装;

看以上的代码就知道只是封装了接口所必要的一些参数,其他参数通过parameters传递进来,返回的数据也没有做处理,所以说并不是很完善,可以在内部将数据解析成相应的格式model、NSArray等等,然后通过执行回调block,更新UI。

© 著作权归作者所有

共有 人打赏支持
上一篇: H5与原生交互
下一篇: 简单日历封装
麦兜卖鱼丸
粉丝 12
博文 69
码字总数 69333
作品 0
桂林
iOS工程师
私信 提问
🎂HeyUI组件库开发一周年🎉🎉

⏰前沿 去年的今天,我没有想过,heyui组件库是否真的能够完成? 毕竟,刚刚写了2个月的组件库,简陋的一塌糊涂。 当时只是不断的闷头写,下班写,周末写。 埋头苦思这Row的组件应该怎么定义...

vvpvvp
05/29
0
0
aehyok.com的成长之路三——框架结构

前言     首先奉上个人网站地址传送门:aehyok.com。 aehyok.com的成长之路一——开篇 中主要阐述了自己为什么建立自己的网站,以及个人网站的大致方向。 aehyok.com的成长之路二——技术...

aehyok
2014/09/24
0
0
深度学习论文总结

本篇总结近期看过的深度学习论文: 1. 自然场景分类(LDA主题模型)论文及实现: 论文理解 A Bayesian Hierarchical Model for Learning Natural Scene Categories 场景分类MATLAB代码实现 ...

牛奶芝麻
02/28
0
0
Android-开发姿势

Android 攻城狮—全套必备神级工具(开发,插件,效率) 如果你有用的酸爽的软件,请下面留言。我会持续更新。。。 “替你” 总结的 Gradle 配置 关于 Gradle 配置的一些总结,欢迎交流! 常...

掘金官方
2017/12/28
0
0
顾问个人成长的体会与建议

周五完成认证,在与几位同事回家的路上,一起谈到了个人成长的问题。有的同事提出疑问:怎么样才能快速成长?为什么有的同事成长那么迅速?结合几天的认证感受,谈谈自己的一些体会与建议: ...

Drate
2011/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入解析ES6之数据解构的用法

本文介绍了深入理解ES6之数据解构的用法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 一 对象解构 对象解构语法在赋值语句的左...

前端攻城老湿
8分钟前
3
0
芯片原理和量子力学

很多文盲觉得量子力学只是一个数学游戏,没有应用价值,呵呵,下面咱给计算机芯片寻个祖宗,请看示范: 导体,咱能理解,绝缘体,咱也能理解,小盆友们第一次被物理整懵的,怕是半导体了,所...

天王盖地虎626
8分钟前
1
0
Django model update的各种用法介绍

Django model update的各种用法介绍 model update常规用法 假如我们的表结构是这样的: class User(models.Model): username=models.CharField(max_length=255,unique=True,verbose_na......

_Change_
12分钟前
1
0
Frost & Sullivan权威报告:阿里云再次领跑云WAF大中华区市场

近日,国际权威分析机构Frost & Sullivan 针对Web应用防火墙(简称“WAF”)领域发布了《2017年亚太区Web应用防火墙市场报告》,阿里云以市场占有率45.8%的绝对优势连续两年领跑大中华区云WAF...

阿里云官方博客
16分钟前
0
0
Java程序员可知为何公司宁花25K重新招人,也不花20K留住老员工?

身在职场,经常会暗自打听同事工资,尤其是得知身边新入职同事的工资居然比自己高,还高出一大截时,心里自然很不平衡,一心想要离职。 那么,为什么公司宁愿花高价招聘新员工也不愿意给老员...

Java填坑路
22分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部