最近读一篇ViewController的瘦身文章,觉得分离Datasource很有用,记录下来。
https://www.objc.io/issues/1-view-controllers/lighter-view-controllers/
个人觉得当一个页面有多个UITableView的时候他们的DataSource代码绝对是庞大的。假如我们实现这样一个页面,DataSource处理比较复杂的时候就可以把其中一个的DataSource分离出来减少ViewController的代码量。
简单的DataSource情况:在数据源里面判断UITableView分别设置
复杂的DataSource情况:我们另外创建一个类专门作为一个UITableView的datasource。在这个类中我们实现数据源的方法。
回顾在数据源中我们做的事情:
1 一般是传入数据模型的数组,这样可以获得row(假设section == 1)。
2 在cellForRow里面从缓存池中取出cell(用到重用标示)
3 给cell赋值(可以使用一个Block 在其中实现)
所以我们在设计这个外部的dataSource的时候将这三个作为参数传入DataSource类来提供数据实现数据源,所以就把他们作为初始化的参数传入好了。
所以外部大概是这样使用
TableViewCellConfigureBlock configureCell = ^(rightTCell *cell, DataModel *model) {
cell.model = model;
};
self.rightDataSource = [[ArrayDataSource alloc] initWithItems:rightDataSourceArray
cellIdentifier:RightCellIdentifier
configureCellBlock:configureCell];
self.rightTableView.dataSource = self.rightDataSource;
数据源类的内部:
私有三个属性用来保存外部传入的三个值
@property (nonatomic, strong) NSArray *items;
@property (nonatomic, copy) NSString *cellIdentifier;
@property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock;
实现初始化方法:
- (id)init
{
return nil;
}
- (id)initWithItems:(NSArray *)anItems
cellIdentifier:(NSString *)aCellIdentifier
configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
{
self = [super init];
if (self) {
self.items = anItems;
self.cellIdentifier = aCellIdentifier;
self.configureCellBlock = [aConfigureCellBlock copy];
}
return self;
}
然后实现数据源就好了
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.items.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RightCell" forIndexPath:indexPath];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"RightCell"];
}
DataModel *item = [self itemAtIndexPath:indexPath];
self.configureCellBlock(cell, item);
return cell;
}
这样就可以了
但是有一个地方需要注意:使用外部的dataSource的UITableView需要先注册cell ,否侧会崩溃(因为我使用storyboard拖的UITableView,Xcode提示如果不注册没办法初始化Storyboard的cell)。githubDemo:https://github.com/Yesi-hoang/-ViewController-dataSource