本節主題(網絡部分-下拉/上拉刷新)
- 源碼地址在文章末尾
-
達成效果
下拉刷新數據
上拉加載更多數據
前言
- 經過十分鐘搭建主流框架_簡單的網絡部分(OC)的介紹,相信你已經實現了基本的聯網獲取數據,但只是粗糙的獲取了固定的數據,下面就讓我們來實現下拉刷新和上拉加載更多吧。同樣,我們先來做準備工作吧。
準備工作
Github尋找優秀的第三方刷新框架
-
1.前人種樹,后人乘涼。有優秀的第三方框架可以使用,當然是極好的,可以大大提高我們的開發效率,如有特殊需求只能自己手寫就除外了
Refresh - 2.查閱第三方框架的README文件(讀者自行閱讀)
- 3.使用cocoapods集成到自己的項目中
刷新的基本實現思路
下拉刷新
- 0.由于本文只關注功能的實現,先撇開原理,我們可以把刷新理解為從服務器加載最新的數據。
- 1.在
viewDidLoad
初始化下拉刷新控件,并綁定下拉刷新(請求網絡數據)的方法,當觸發下拉刷新,便會調用loadData
方法。self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
- 2.在
loadData
內實現請求網絡數據(詳見《十分鐘搭建主流框架_簡單的網絡部分(OC)》)。 - 3.請求成功,停止刷新控件
[weakSelf.tableView.header endRefreshing];
- 4.請求失敗,停止刷新控件
[weakSelf.tableView.header endRefreshing];
上拉加載更多
- 0.由于我們的實現是MVC模式,可以簡單理解為:修改了模型的數據,View的界面展示也會隨之變化。
- 1.定義‘頁碼’屬性(用于加載下一頁所要傳遞的參數)
@property (nonatomic,assign) NSInteger pn;
- 2.初始化上拉刷新控件,并綁定上拉加載更多方法,當觸發上拉加載事件,便會調用
loadMoreData
方法。self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- 3.在
loadMoreData
內實現加載更多數據的基本邏輯- (1)請求參數發生變化,加上
params[@"pn"] = @(self.pn);
- (2)在請求成功的block內增加‘頁碼’
weakSelf.pn ++;
- (3)在請求成功的block內使用新的模型數組接收數據
NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
并拼接到原數組的尾部[weakSelf.menus addObjectsFromArray:array];
- (4)刷新表格
[weakSelf.tableView reloadData];
- (5)停止刷新控件
[weakSelf.tableView.footer endRefreshing];
- (1)請求參數發生變化,加上
詳細實現步驟 上代碼
(一)下拉
- 在
setupTable
內初始化頭部刷新控件
// 頭部刷新控件
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
[self.tableView.header beginRefreshing];
- 實現
loadData
方法
/**
* 發送請求并獲取數據方法
*/
- (void)loadData{
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
self.pn = 1;
// 請求參數(根據接口文檔編寫)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"menu"] = @"西紅柿";
params[@"pn"] = @(self.pn);
params[@"rn"] = @"10";
params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";
// 在AFN的block內使用,防止造成循環引用
__weak typeof(self) weakSelf = self;
[self.manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
[self.manager GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"請求成功");
// 利用MJExtension框架進行字典轉模型
weakSelf.menus = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
weakSelf.pn ++;
// 刷新數據(若不刷新數據會顯示不出)
[weakSelf.tableView reloadData];
[weakSelf.tableView.header endRefreshing];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"請求失敗 原因:%@",error);
[weakSelf.tableView.header endRefreshing];
}];
}
(二)上拉
- 在
setupTable
內初始化上拉刷新控件
// 尾部刷新控件
self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- 實現
loadMoreData
方法
/**
* 加載更多數據
*/
- (void)loadMoreData{
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
// 請求參數(根據接口文檔編寫)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"menu"] = @"西紅柿";
params[@"pn"] = @(self.pn);
params[@"rn"] = @"10";
params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";
// 在AFN的block內使用,防止造成循環引用
__weak typeof(self) weakSelf = self;
[self.manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
[self.manager GET:CYXRequestURL parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
// 利用MJExtension框架進行字典轉模型
NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
[weakSelf.menus addObjectsFromArray:array];
weakSelf.pn ++;
// 刷新數據(若不刷新數據會顯示不出)
[weakSelf.tableView reloadData];
[weakSelf.tableView.footer endRefreshing];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"請求失敗 原因:%@",error);
[weakSelf.tableView.footer endRefreshing];
}];
}
- 到這里已經簡單實現了下拉與上拉刷新的功能,下次再討論更多的其他功能吧 _
- 附:源碼github地址