本節(jié)主題(網(wǎng)絡(luò)部分-下拉/上拉刷新)
- 源碼地址在文章末尾
-
達(dá)成效果
下拉刷新數(shù)據(jù)
上拉加載更多數(shù)據(jù)
前言
- 經(jīng)過十分鐘搭建主流框架_簡單的網(wǎng)絡(luò)部分(OC)的介紹猜丹,相信你已經(jīng)實(shí)現(xiàn)了基本的聯(lián)網(wǎng)獲取數(shù)據(jù)嫉柴,但只是粗糙的獲取了固定的數(shù)據(jù),下面就讓我們來實(shí)現(xiàn)下拉刷新和上拉加載更多吧榕栏。同樣,我們先來做準(zhǔn)備工作吧蕾各。
準(zhǔn)備工作
Github尋找優(yōu)秀的第三方刷新框架
-
1.前人種樹扒磁,后人乘涼。有優(yōu)秀的第三方框架可以使用式曲,當(dāng)然是極好的妨托,可以大大提高我們的開發(fā)效率,如有特殊需求只能自己手寫就除外了
Refresh - 2.查閱第三方框架的README文件(讀者自行閱讀)
- 3.使用cocoapods集成到自己的項(xiàng)目中
刷新的基本實(shí)現(xiàn)思路
下拉刷新
- 0.由于本文只關(guān)注功能的實(shí)現(xiàn)吝羞,先撇開原理兰伤,我們可以把刷新理解為從服務(wù)器加載最新的數(shù)據(jù)。
- 1.在
viewDidLoad
初始化下拉刷新控件脆贵,并綁定下拉刷新(請求網(wǎng)絡(luò)數(shù)據(jù))的方法,當(dāng)觸發(fā)下拉刷新医清,便會調(diào)用loadData
方法。self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
- 2.在
loadData
內(nèi)實(shí)現(xiàn)請求網(wǎng)絡(luò)數(shù)據(jù)(詳見《十分鐘搭建主流框架_簡單的網(wǎng)絡(luò)部分(OC)》)卖氨。 - 3.請求成功会烙,停止刷新控件
[weakSelf.tableView.header endRefreshing];
- 4.請求失敗负懦,停止刷新控件
[weakSelf.tableView.header endRefreshing];
上拉加載更多
- 0.由于我們的實(shí)現(xiàn)是MVC模式,可以簡單理解為:修改了模型的數(shù)據(jù)柏腻,View的界面展示也會隨之變化纸厉。
- 1.定義‘頁碼’屬性(用于加載下一頁所要傳遞的參數(shù))
@property (nonatomic,assign) NSInteger pn;
- 2.初始化上拉刷新控件,并綁定上拉加載更多方法五嫂,當(dāng)觸發(fā)上拉加載事件颗品,便會調(diào)用
loadMoreData
方法。self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- 3.在
loadMoreData
內(nèi)實(shí)現(xiàn)加載更多數(shù)據(jù)的基本邏輯- (1)請求參數(shù)發(fā)生變化,加上
params[@"pn"] = @(self.pn);
- (2)在請求成功的block內(nèi)增加‘頁碼’
weakSelf.pn ++;
- (3)在請求成功的block內(nèi)使用新的模型數(shù)組接收數(shù)據(jù)
NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
并拼接到原數(shù)組的尾部[weakSelf.menus addObjectsFromArray:array];
- (4)刷新表格
[weakSelf.tableView reloadData];
- (5)停止刷新控件
[weakSelf.tableView.footer endRefreshing];
- (1)請求參數(shù)發(fā)生變化,加上
詳細(xì)實(shí)現(xiàn)步驟 上代碼
(一)下拉
- 在
setupTable
內(nèi)初始化頭部刷新控件
// 頭部刷新控件
self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadData)];
[self.tableView.header beginRefreshing];
- 實(shí)現(xiàn)
loadData
方法
/**
* 發(fā)送請求并獲取數(shù)據(jù)方法
*/
- (void)loadData{
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
self.pn = 1;
// 請求參數(shù)(根據(jù)接口文檔編寫)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"menu"] = @"西紅柿";
params[@"pn"] = @(self.pn);
params[@"rn"] = @"10";
params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";
// 在AFN的block內(nèi)使用沃缘,防止造成循環(huán)引用
__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框架進(jìn)行字典轉(zhuǎn)模型
weakSelf.menus = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
weakSelf.pn ++;
// 刷新數(shù)據(jù)(若不刷新數(shù)據(jù)會顯示不出)
[weakSelf.tableView reloadData];
[weakSelf.tableView.header endRefreshing];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"請求失敗 原因:%@",error);
[weakSelf.tableView.header endRefreshing];
}];
}
(二)上拉
- 在
setupTable
內(nèi)初始化上拉刷新控件
// 尾部刷新控件
self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- 實(shí)現(xiàn)
loadMoreData
方法
/**
* 加載更多數(shù)據(jù)
*/
- (void)loadMoreData{
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
// 請求參數(shù)(根據(jù)接口文檔編寫)
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"menu"] = @"西紅柿";
params[@"pn"] = @(self.pn);
params[@"rn"] = @"10";
params[@"key"] = @"2ba215a3f83b4b898d0f6fdca4e16c7c";
// 在AFN的block內(nèi)使用躯枢,防止造成循環(huán)引用
__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框架進(jìn)行字典轉(zhuǎn)模型
NSArray *array = [CYXMenu objectArrayWithKeyValuesArray:responseObject[@"result"]];
[weakSelf.menus addObjectsFromArray:array];
weakSelf.pn ++;
// 刷新數(shù)據(jù)(若不刷新數(shù)據(jù)會顯示不出)
[weakSelf.tableView reloadData];
[weakSelf.tableView.footer endRefreshing];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"請求失敗 原因:%@",error);
[weakSelf.tableView.footer endRefreshing];
}];
}
- 到這里已經(jīng)簡單實(shí)現(xiàn)了下拉與上拉刷新的功能,下次再討論更多的其他功能吧 _
- 附:源碼github地址