文档章节

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

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

前言

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

 

个人理解(一)创建合理的工具类--  项目做到一定的程度,多多少少会有很多的代码冗余。或者不是说代码冗余,而是代码复用性不高,不同的地方重复的代码很多;就比如说设置字体颜色,这个那个客户端都是必不可少的,有的人使用#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。

© 著作权归作者所有

共有 人打赏支持
麦兜卖鱼丸
粉丝 12
博文 56
码字总数 69333
作品 0
桂林
iOS工程师
aehyok.com的成长之路三——框架结构

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

aehyok ⋅ 2014/09/24 ⋅ 0

🎂HeyUI组件库开发一周年🎉🎉

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

vvpvvp ⋅ 05/29 ⋅ 0

Android-开发姿势

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

掘金官方 ⋅ 2017/12/28 ⋅ 0

深度学习论文总结

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

牛奶芝麻 ⋅ 02/28 ⋅ 0

顾问个人成长的体会与建议

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

Drate ⋅ 2011/11/24 ⋅ 0

Apache Tomcat 7.0.50 发布

Apache Tomcat 7.0.50 发布,此版本相对于上一个版本 7.0.47包括了一些 bug 修复和功能改进。 注意事项: 此版本包括4个压缩的二进制文件:一个通用文件和三个可运行在不同 CPU 结构的 wind...

oschina ⋅ 2014/01/13 ⋅ 2

初级iOS开发者进阶之路(包括一些面试心得 )

最近随着公司规模扩大(还是小公司),公司开始计划招人,很幸运,终于能当一回面试官了,可以从面试者到面试官的转变让我对 iOS 招聘有了更多的感受。经过一段时间的面试,我们还是没有找到志...

夜空下最亮的亮点 ⋅ 2017/11/09 ⋅ 0

2017年年终总结

前言 不知不觉,2017年又接近尾声了,又到了该写年终总结的时候了,往年这个时候都会熙熙攘攘,各大平台提早预热过年的气氛,而今年显得格外的平静,这可能正如我的现在的心境,波澜而不惊!...

韩俊强 ⋅ 01/03 ⋅ 0

ORM知多少

公司的项目中都涉及到ORM(Object Relational Mapping)框架,EF映射、Hibernate、Mybatis、JPA……不断涌现的新鲜词语,面试的时候面试官还在说EFframework(有木有很奇怪),那就来一探究竟吧...

zt15732625878 ⋅ 2017/10/12 ⋅ 0

【PDF分享】Grails企业web应用开发与部署.pdf

Grails 是个好东西, 在中国算是个新东西,尝鲜总要付出代价。我喜欢能快速解决问题的方式方法,有些时候即使付出代价,也值了。在大家都还在犹豫的时候,综合分析后,决定在我们的项目中使用...

鉴客 ⋅ 2010/09/12 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 25分钟前 ⋅ 2

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 49分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 54分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部