做頁(yè)面除了功能點(diǎn)的開發(fā),其他瑣碎的事情也會(huì)消耗了不少的腦力,比如,網(wǎng)絡(luò)請(qǐng)求的過程中獲取數(shù)據(jù)處理數(shù)據(jù)是我們喜歡做的事情,但是無網(wǎng)絡(luò)、需要登錄驗(yàn)證、請(qǐng)求成功沒數(shù)據(jù)、下拉刷新請(qǐng)求的數(shù)據(jù)、上拉分頁(yè)的數(shù)據(jù)、請(qǐng)求失敗...處理起來就比較消耗耐心了,雖然不難但是需要細(xì)心。整理一下,以備后面開發(fā)時(shí)捋順?biāo)悸?。封裝網(wǎng)絡(luò)請(qǐng)求方法不在本文討論范圍~

1,判斷網(wǎng)絡(luò)狀況
- (BOOL)requestListData:(BOOL)refresh {
BOOL reachable = [TYDialogUtil isHasNetwork:NO];
if (!reachable){ // 無網(wǎng)絡(luò)
// 第一種情況
return NO;
}else{ // 網(wǎng)絡(luò)正常
// 第二種情況
}
}
在網(wǎng)絡(luò)請(qǐng)求之前,建議先判斷手機(jī)網(wǎng)絡(luò)狀態(tài),[TYDialogUtil isHasNetwork:NO];是我的項(xiàng)目中判斷無網(wǎng)絡(luò)的方法。你需要自己封裝方法,或者用你項(xiàng)目中已有的工具類方法進(jìn)行判斷~
- 無網(wǎng)絡(luò)
無網(wǎng)絡(luò)情況下需要給用戶進(jìn)行提示,一般提示分三類 (提示細(xì)節(jié)需進(jìn)一步與產(chǎn)品經(jīng)理溝通)
if (self.listArray.count>0) {
//1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
}else if (有緩存){
//2, 提取緩存數(shù)據(jù),并給self.listArray賦值
[mainTable_ reloadData]; //reload tableview 數(shù)據(jù)
}else{
//3, 顯示無網(wǎng)絡(luò)空白頁(yè)
}
1,有歷史數(shù)據(jù)
self.listArray是存儲(chǔ)數(shù)據(jù)的全局變量, self.listArray.count>0 說明當(dāng)前頁(yè)面之前請(qǐng)求過數(shù)據(jù)存在,在有歷史數(shù)據(jù)的情況下,給用戶tip提示或者彈框提示
如下圖:


2,有緩存數(shù)據(jù)
第二種情況其實(shí)包括self.listArray.count == 0,但是還需要判斷是否有緩存,如果有,把讀取緩存獲取的數(shù)據(jù)賦值給全局變量self.listArray,(然后刷新tableview或者collectionView... 總之有數(shù)據(jù)了,正常支配數(shù)據(jù))
3, 顯示空白頁(yè)
沒有歷史數(shù)據(jù),也沒有緩存數(shù)據(jù)的情況下,為了避免整個(gè)頁(yè)面白茫茫一片,需要自定義一個(gè)空白頁(yè)添加到頁(yè)面上
如圖:

- 有網(wǎng)絡(luò)
如果有網(wǎng)絡(luò),不要忘記把自定義的空白頁(yè)隱藏,然后進(jìn)行網(wǎng)絡(luò)請(qǐng)求。
預(yù)判斷網(wǎng)絡(luò)狀況的整體邏輯流程:
- (BOOL)requestListData:(BOOL)refresh {
BOOL reachable = [TYDialogUtil isHasNetwork:NO];
if (!reachable){ // 無網(wǎng)絡(luò)
if (self.listArray.count>0) {
//1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
}else if (有緩存){
//2, 提取緩存數(shù)據(jù),并給self.listArray賦值
[mainTable_ reloadData]; // 有新數(shù)據(jù)后刷新列表
}else{
//3, 顯示無網(wǎng)絡(luò)空白頁(yè)
}
return NO;
}else{ // 網(wǎng)絡(luò)正常
// 隱藏空白頁(yè)
// 網(wǎng)絡(luò)請(qǐng)求
}
}
2,網(wǎng)絡(luò)請(qǐng)求
[TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 第三種情況
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 第四種情況
}];
網(wǎng)絡(luò)請(qǐng)求有很多種方法,可以用原生方法,可以用第三方庫(kù),我自己是為了方便對(duì)第三方庫(kù)加了個(gè)外殼,簡(jiǎn)單封裝了一下。網(wǎng)絡(luò)具體內(nèi)容本文就不再深入了,繼續(xù)邏輯分析~ 網(wǎng)絡(luò)請(qǐng)求結(jié)果很明顯是兩種,success 和failure
2.1 網(wǎng)絡(luò)請(qǐng)求成功
網(wǎng)絡(luò)請(qǐng)求成功后,情況是最復(fù)雜的,接下來我們一個(gè)一個(gè)分析:
一般網(wǎng)絡(luò)請(qǐng)求返回的數(shù)據(jù)是json或者xml格式,用工具類分析解析數(shù)據(jù)后,進(jìn)行以下判斷:
if (有數(shù)據(jù)){
if (刷新) {
// 第五種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
// 第六種情況 添加新數(shù)據(jù)
// 第七種情況 刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
}else {//上拉
// 第八種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
}
else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
if (無歷史數(shù)據(jù)) {
// 顯示自定義空白頁(yè)
}else { //有歷史數(shù)據(jù)
if (刷新) {
// 刷新 (暫無更多新內(nèi)容)
}else {//上拉
//上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
}
}
}
網(wǎng)絡(luò)請(qǐng)求成功后,有時(shí)候有數(shù)據(jù),很多時(shí)候也會(huì)是空數(shù)據(jù),
有數(shù)據(jù)的情況下
既然有數(shù)據(jù),就會(huì)考慮有沒有歷史數(shù)據(jù)?新數(shù)據(jù)的加入方式,加在原有數(shù)據(jù)之前,還是簡(jiǎn)單的把新數(shù)據(jù)add到舊數(shù)據(jù)的后面?要不要緩存?以下分析考慮這些數(shù)據(jù)的先后步驟:
- 刷新邏輯分類:
如果有緩存方面的需求,一般在刷新的時(shí)候把get的數(shù)據(jù)加入緩存,有的緩存需求,只要求第一次refresh的新數(shù)據(jù),有的要求緩存所有數(shù)據(jù),如果緩存全部數(shù)據(jù),不要忘記設(shè)置的緩存最大值,不過每個(gè)app、甚至每個(gè)頁(yè)面的刷新機(jī)制都不一樣,大同小異,沒有技術(shù)難點(diǎn),所以需要你具體問題具體分析了
因?yàn)槭窍吕⑿拢话憬ㄗh把get的最新數(shù)據(jù)加到最前面,這樣刷新之后用戶第一眼看到的是最新內(nèi)容,很少有加到后面的情況,
1,保留歷史數(shù)據(jù),在self.listArray數(shù)組index==0 的位置插入新數(shù)據(jù)
或 清除舊數(shù)據(jù),直接給self.listArray 賦新值
2,考慮是否將數(shù)據(jù)加入緩存
3,提示 “為您更新了XX條新內(nèi)容” ,可選,閱讀性質(zhì)的app需要,電商等app就不需要此類提示
- 上拉分頁(yè)請(qǐng)求邏輯:
1,保留歷史數(shù)據(jù),self.listArray 直接add新數(shù)據(jù)
2,考慮緩存情況
3, pageindex ++
注:分頁(yè)請(qǐng)求,有一個(gè)點(diǎn)需要注意,就是pageindex的計(jì)算,如果上傳給服務(wù)器的參數(shù)有pageindex(第幾頁(yè),int類型,記得要在http請(qǐng)求方法外面初始化),需要在此 ++,如果不需要傳此參數(shù),那么你可以忽略這個(gè)細(xì)節(jié)
無數(shù)據(jù)的情況下
既然沒有數(shù)據(jù),就會(huì)涉及要怎么樣給用戶做提示,還有考慮要不要重復(fù)加載網(wǎng)絡(luò)請(qǐng)求方法,來重新獲取數(shù)據(jù)(要注意細(xì)節(jié),避免死循環(huán))
再看一下偽代碼:
//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
if (無歷史數(shù)據(jù)) {
// 顯示自定義空白頁(yè)
}else { //有歷史數(shù)據(jù)
if (刷新) {
// 提示 (暫無更多新內(nèi)容)
}else {//上拉
//上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
}
}
- 無歷史數(shù)據(jù)
顯示自定義空白頁(yè)(無歷史數(shù)據(jù)+無新數(shù)據(jù) 所以要顯示自定義空白頁(yè))
- 有歷史數(shù)據(jù)
1,下拉刷新,
頂部tip提示,或者彈框提示 "暫無更多新內(nèi)容"
2,上拉加載,
一般在列表底部,或者彈框 提示 ("暫無更多新內(nèi)容"、“已經(jīng)拉到底了”、“已到末頁(yè)請(qǐng)返回閱讀”)
目前為止偽代碼邏輯:
[TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 第三種情況
if (有數(shù)據(jù)){
if (刷新) {
// 第五種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
// 第六種情況 添加新數(shù)據(jù)
// 第七種情況 刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
}else {//上拉
// 第八種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
}
else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
if (無歷史數(shù)據(jù)) {
// 顯示自定義空白頁(yè)
}else { //有歷史數(shù)據(jù)
if (刷新) {
// 刷新 (暫無更多新內(nèi)容)
}else {//上拉
//上來無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
}
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 第四種情況
}];
2.2 網(wǎng)絡(luò)請(qǐng)求失敗
if (self.listArray.count>0) {
// 提示 (網(wǎng)絡(luò)連接失敗,請(qǐng)稍后再試)
}else{
// 顯示自定義空白頁(yè)
}
這部分提示與之前的雷同,就不贅述解釋了~
最后
總體邏輯偽代碼:
- (BOOL)requestListData:(BOOL)refresh {
BOOL reachable = [TYDialogUtil isHasNetwork:NO];
if (!reachable){ // 無網(wǎng)絡(luò)
if (self.listArray.count>0) {
//1, 提示 “沒有網(wǎng)絡(luò)連接,請(qǐng)稍后再試”
}else if (有緩存){
//2, 提取緩存數(shù)據(jù),并給self.listArray賦值
[mainTable_ reloadData]; // 有新數(shù)據(jù)后刷新列表
}else{
//3, 顯示無網(wǎng)絡(luò)空白頁(yè)
}
return NO;
}else{ // 網(wǎng)絡(luò)正常
// 隱藏空白頁(yè)
// 網(wǎng)絡(luò)請(qǐng)求
[TYHTTPManager GET:baseUrl parameters:parameters resultClass:[NSDictionary class] success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 第三種情況
if (有數(shù)據(jù)){
if (刷新) {
// 第五種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
// 第六種情況 添加新數(shù)據(jù)
// 第七種情況 刷新有數(shù)據(jù)提示 (為您更新了XX條新內(nèi)容)(可選)
}else {//上拉
// 第八種情況 對(duì)數(shù)據(jù)進(jìn)行緩存(可選)
}
}else{//網(wǎng)絡(luò)請(qǐng)求無數(shù)據(jù)
if (無歷史數(shù)據(jù)) {
// 顯示自定義空白頁(yè)
}else { //有歷史數(shù)據(jù)
if (刷新) {
// 刷新 (暫無更多新內(nèi)容)
}else {//上拉
//上拉無數(shù)據(jù)提示 (已到末頁(yè)請(qǐng)返回閱讀)
}
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 第四種情況
if (self.listArray.count>0) {
// 提示 (網(wǎng)絡(luò)連接失敗,請(qǐng)稍后再試)
}else{
// 顯示自定義空白頁(yè)
}
}];
}
return YES;
}
以上是本人個(gè)人的邏輯,敬請(qǐng)參考~