ShannonChenCHN / iOS-App-Architecture

『iOS 应用架构研究』A journey of diving into iOS app architecture.
35 stars 9 forks source link

读 『如何写好一个UITableView』 #2

Open ShannonChenCHN opened 7 years ago

ShannonChenCHN commented 7 years ago

这篇文章主要讲解了如何写好一个列表这个最熟悉的主题,分别讨论了以下几个问题:

核心问题是如何减轻业务方的负责。

ShannonChenCHN commented 7 years ago

『如何写好一个UITableView』

一、痛点

二、MVC

三、传统的做法

现状

Controller 中实现 delegate 和 dataSource 方法,管理 UI 和数据、交互。

数据源

总共有以下几类方法:

其中两个最常用的方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

代理

总共有以下几类方法:

其中以下几个方法最常用:

- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

四、优化

1. 数据源

// 提供一个接口用于获取指定 indexPath 对应的 model

2. 代理

3.如何将上面针对数据源和代理的优化串联起来

4. 成果

5. 下一步

五、网络层

1. 为什么需要网络层

2. 三个环节

3. 实现

4. 实践

六、下拉刷新和上拉加载更多

1. 两个问题

2.实现

七、总结

一些思考: 核心思想:复用+解耦+易于理解、逻辑清晰

  1. 值得借鉴之处:
  2. 不同看法:
  3. 补充:
    • 空态页
    • 网络错误提示 toast
    • 页面缓存