项目总结(个人,还在不断更新中)
2016-05-20 00:00
417 查看
摘要: 项目的一些个人总结,主要是一些思路的记录。
前言
我认为,进步不仅仅是取决于你不断的在行走,有时候停下来,整理整理思路,总结之前所遇到的困难,也是一种进步。善于总结,发现以前的不足,然后想办法解决他,这个过程就是进步的开始,我不认为做得多就一定成长快,但是,做了不去思考肯定是成长不了的,只能说是一直在原地踏步。当然这样的工作你需要不断的去摸索,然后得到一套自己觉得合理的项目模块分类,让项目变得易扩展、易维护。
个人理解(一)创建合理的工具类-- 项目做到一定的程度,多多少少会有很多的代码冗余。或者不是说代码冗余,而是代码复用性不高,不同的地方重复的代码很多;就比如说设置字体颜色,这个那个客户端都是必不可少的,有的人使用#define kColor [UIColor whiteColor]预先定义好颜色,但是这样内容多的话,不会美观,这时候我们可以创建一个颜色工具类(UIColor+Utils)如下图;
我个人的理解是能用category创建工具类的尽量用,如果都是用继承NSObject来创建的话,到最后内容多的话,代码会很多,不利于维护;更多的工具类如下(借鉴,用于举例说明);
等等。
个人理解(二)通用的模板-- 其实大家不难发现,很多界面的布局都可以使用UITableView这个控件进行布局。如果是单纯的列表页面,可以创建一个共用的BaseTableViewController,用于控制请求后台接口的操作、上拉或者下拉刷新的操作等等,而子控制器负责加载显示数据等等。比如说一下的代码;
统一的去管理tableview的刷新数据的操作。而子控制器需要做的就是配置需要访问的接口API以及其他是否自动刷新的属性的设置。
个人理解(三)网络层的封装-- 网络层对于所有后台数据交互的客户端都是必不可少的,对于第三方AFNetworking,原本的API复用性不强,需要我们自己再次封装,当然是根据我们的业务需求来决定。就比我说我的一个项目的一个POST请求的封装;
看以上的代码就知道只是封装了接口所必要的一些参数,其他参数通过parameters传递进来,返回的数据也没有做处理,所以说并不是很完善,可以在内部将数据解析成相应的格式model、NSArray等等,然后通过执行回调block,更新UI。
前言
我认为,进步不仅仅是取决于你不断的在行走,有时候停下来,整理整理思路,总结之前所遇到的困难,也是一种进步。善于总结,发现以前的不足,然后想办法解决他,这个过程就是进步的开始,我不认为做得多就一定成长快,但是,做了不去思考肯定是成长不了的,只能说是一直在原地踏步。当然这样的工作你需要不断的去摸索,然后得到一套自己觉得合理的项目模块分类,让项目变得易扩展、易维护。
个人理解(一)创建合理的工具类-- 项目做到一定的程度,多多少少会有很多的代码冗余。或者不是说代码冗余,而是代码复用性不高,不同的地方重复的代码很多;就比如说设置字体颜色,这个那个客户端都是必不可少的,有的人使用#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。
相关文章推荐
- JS基础知识
- MongoDB Java
- Python 解释器自动载入的模块
- 对 Python 迭代的深入研究
- HBase(九):HBaseAndMapReduce(三)
- HBase(十):HBaseAndMapReduce(四)
- Linux运维初级工程师必修课
- Redis网络架构及单线程模型
- 量化投资相关
- Log4J日志配置详解
- Snapshot Instance 操作详解 - 每天5分钟玩转 OpenStack(36)
- Android TextView与EditText 同步显示
- 数据库的范式(1NF、2NF、3NF、BNCF)
- ButterKnife 8.0.1配置
- Linux命令大全chm版本下载
- oracle日常 常用函数与脚本
- java反射
- 如何在Ember2.0及以上版本模板中使用script标签
- 安装activiti插件遇到的问题
- pinpoint - 后端搭建及使用