轻量化ViewControllers,读文章做的总结
推荐一个网站 http://objccn.io/ 我这两天才开始看 获益匪浅
看了第一篇文章 《更轻量的View Controllers》感觉写的不错 感觉作者 原文地址 http://objccn.io/issue-1-1/
示例项目的代码有点旧 Xcode6运行出错 懒的理了 所以我大概模仿他写了一点测试代码 运行环境Xcode7/iOS9
轻量化ViewControllers 顾名思义 就是把ViewController的代码进行简化 让控制器更简单 更清晰
一、把DataSource和其他potocols分离出控制器
因为做项目很多控制器都是TableViewController,所以必须要有数据源(TableViewDataSource)输入,一般DataSource的3个方法都在控制器里
我们的目的就是要把他分离出来,方法就是自定义一个类,然后控制器调用这个类
并且这个数据源类是通用的,别的TableViewController或者有定义了tableView/collectionView的控制器都可以调用
自定义ArrayDataSource类
1.定义一个Block,用于传递cell和数据
typedef void (^TableViewCellPassBlock)(id cell,id item);
2.定义一个方法给控制器调用,用于初始化ArrayDataSource类(需要暴露在.h文件中)
@property(nonatomic,strong) NSArray *items;
@property(nonatomic,copy) NSString *cellIdentifier;
@property(nonatomic,copy) TableViewCellPassBlock passBlock;
/**
* 初始化数据源的方法
* @param anItems 用于接受数据的数组
* @param aCellIdentifier 接收cell的ID
* @param aPassBlock 接收传递的Block
*/
- (id)initWithItems:(NSArray *)anItems
cellIdentifier:(NSString *)aCellIdentifier
passBlock:(TableViewCellPassBlock)aPassBlock
{
self = [super init];
if(self){
self.items = anItems;
self.cellIdentifier = aCellIdentifier;
self.passBlock = [aPassBlock copy];
}
return self;
}
3.然后就是数据源的方法
/** 这个方法找出数组的数据 后面要用到*/
- (id)itemAtIndexPath:(NSIndexPath *)indexPath
{
return self.items[(NSUInteger) indexPath.row];
} #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.items.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier
forIndexPath:indexPath];
id item = [self itemAtIndexPath:indexPath];
self.passBlock(cell, item);
return cell;
}
ArrayDataSource类就这样定义完成了
接下来是控制器的调用
只需要写以下几行代码便可以设置tableView的数据源,不用每个控制器都写那三个方法
//数组传数据是接下来要简化的,后面会详细说明
NSArray *arr = [AppDelegate sharedDelegate].returnModel.returnData;
//使用Block回调,传递cell和模型数据
TableViewCellPassBlock passBlock = ^(TestModelCell *cell,TestModel *model){
//测试方法,只是传递model给cell,这个方法用分类写的,自定义cell的分类
[cell setName:model];
};
//初始化并设置tableView的数据源
self.dataSource = [[ArrayDataSource alloc] initWithItems:arr cellIdentifier:@"TestModelCell" passBlock:passBlock];
self.tableView.dataSource = self.dataSource;
二、将业务逻辑放到model中
一些跟控制器无关的代码可以放到模型中
测试代码我写了一个TestModel,只有一个属性和一个初始化方法
@property(nonatomic,copy) NSString *name; - (instancetype)initWithName:(NSString *)name;
然后又写了一个model,因为要返回数据所以我叫ReturnModel
在.h文件中暴露的方法
//类方法,创建的时候用这个方法
+ (instancetype)returnModel;
//这个方法用于返回数据
- (NSArray *)returnData;
然后在.m文件中
+ (instancetype)returnModel
{
return [[self alloc] init];
} - (id)init
{
self = [super init];
if (self) {
//调用方法执行业务逻辑的方法
[self doSomething];
} return self;
}
//可以在这个方法中执行与控制器无关的业务逻辑
- (void)doSomething
{
NSLog(@"try to do something");
} //在这个方法中返回模型数据,数据略
- (NSArray *)returnData
{
NSArray *arr = [[NSArray alloc] initWithObject:...];
return arr;
}
思路就是在返回数据的模型类中执行业务逻辑,在创建类的时候执行
在AppDelegate中添加方法和属性,并且暴露在.h文件中
+ (instancetype)sharedDelegate
{
return [UIApplication sharedApplication].delegate;
} @synthesize returnModel = _returnModel; - (ReturnModel *)returnModel
{
if (_returnModel == nil) {
_returnModel = [ReturnModel returnModel];
}
return _returnModel;
}
所以控制器直接调用方法得到数据
NSArray *arr = [AppDelegate sharedDelegate].returnModel.returnData;
这时候控制器已经很简化了
可以把网络请求也放在model层
最后吐槽一句博客园的代码高亮好难看
轻量化ViewControllers,读文章做的总结的更多相关文章
- iOS Method Swizzling和分类的妙用AppDelegate轻量化处理
http://www.cocoachina.com/ios/20151117/14167.html 简介 在iOS工程中,AppDelegate往往会有上千行,甚至几千行,这样就会给维护AppDele ...
- 轻量化模型之MobileNet系列
自 2012 年 AlexNet 以来,卷积神经网络在图像分类.目标检测.语义分割等领域获得广泛应用.随着性能要求越来越高,AlexNet 已经无法满足大家的需求,于是乎各路大牛纷纷提出性能更优越的 ...
- CNN结构演变总结(二)轻量化模型
CNN结构演变总结(一)经典模型 导言: 上一篇介绍了经典模型中的结构演变,介绍了设计原理,作用,效果等.在本文,将对轻量化模型进行总结分析. 轻量化模型主要围绕减少计算量,减少参数,降低实际运行时间 ...
- 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)
完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...
- 轻量化模型系列--GhostNet:廉价操作生成更多特征
前言 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...
- 基于WebGL/Threejs技术的BIM模型轻量化之图元合并
伴随着互联网的发展,从桌面端走向Web端.移动端必然的趋势.互联网技术的兴起极大地改变了我们的娱乐.生活和生产方式.尤其是HTML5/WebGL技术的发展更是在各个行业内引起颠覆性的变化.随着WebG ...
- 铁大Facebook轻量化界面NABCD
界面轻量化: N:满足了用户更快速.更直接.更方便寻求自己所要信息的需求,不被复杂界面以及各种广告所困扰. A:我们将会用Bootstrap工具包开发前端界面,Bootstrap是基于jQuery框架 ...
- js便签笔记(14)——用nodejs搭建最简单、轻量化的http server
1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...
- 【本地服务器】用nodejs搭建最简单、轻量化的http server
1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...
随机推荐
- js中使用this的一些注意事项
先看看这段代码 var x =9; var fobj ={ x:1, test:function(callback){ var x= 2; callback(); } } function pp(){ ...
- Leetcode解题记录
尽量抽空刷LeetCode,持续更新 刷题记录在github上面,https://github.com/Zering/LeetCode 2016-09-05 300. Longest Increasi ...
- [Swust OJ 771]--奶牛农场(几何题,画图就好)
题目链接:http://acm.swust.edu.cn/problem/771/ Description 将军有一个用栅栏围成的矩形农场和一只奶牛,在农场的一个角落放有一只矩形的箱子,有一天将 ...
- jbpmAPI-1
1.1. What is jBPM? jBPM是一个灵活的业务流程管理(BPM)套件.它是轻量级的,完全开源Apache许可下(分布式),用Java编写的.它允许您模型.执行和监控业务流程的整个生命周 ...
- 让innerHTML方法添加到元素里的js可以被解析执行
<!DOCTYPE html> <html> <head> </head> <body> <div id="test&quo ...
- mysql基础(mysql数据库导入到处) 很基础很实用
一.MYSQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二.简 ...
- 谷歌浏览器javascript调试教程
扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. 回复:"茶爸爸" 看看有什么!! 怎样打开Chrom ...
- Redhat 5.8系统安装R语言作Arima模型预测
请见Github博客:http://wuxichen.github.io/Myblog/timeseries/2014/09/02/RJavaonLinux.html
- OracleDBConsoleorcl无法启动
OracleDBConsoleorcl无法启动 向左转|向右转 提问者采纳 2010-10-13 19:40 我前几天刚解决了这个问题 这个错误原因是因为你的ip是动态获取的,你在安装Oracle时 ...
- CURL基础
下载单个文件: #下载单个文件,默认将输出打印到标准输出中(STDOUT)中curl http://www.centos.org # 将文件下载到本地并命名为mygettext.html curl - ...