大家在開發(fā)APP的時候總會碰到call接口網(wǎng)絡(luò)超時或者網(wǎng)絡(luò)丟失的情況,那么這種情況下比較好的用戶體驗是在當(dāng)前頁面展示一個占位符,占位符上有重新刷新頁面的按鈕讓用戶可以重新刷新頁面,效果如下:

WechatIMG59.jpeg
給頁面加一個占位符是很簡單的,但是怎么做一個全局的占位符機(jī)制是我們需要做的,因為任何頁面都有可能觸發(fā)這個機(jī)制,如果對所有的ViewController都加一個占位符的方法,會顯得很多余。我對這個機(jī)制的做法是這樣的:
添加placeholder機(jī)制:
- 在項目里我會有一個UIViewController的基類,叫做BaseViewController,項目里所有業(yè)務(wù)相關(guān)的UIViewController都會基于這個BaseViewController,在這個基類里,我加了一個方法叫
handleErrorMessage:(NSError *)error,這個方法會處理網(wǎng)絡(luò)請求返回的錯誤信息,在AFNetworking里當(dāng)errorCode是-1009的時候代表網(wǎng)絡(luò)丟失,這種情況下,我們將要給當(dāng)前的ViewController加上網(wǎng)絡(luò)丟失的placeholder
網(wǎng)絡(luò)請求重新加載機(jī)制:
- 首先,在項目里我會有一個
protocol給所有的ViewController可以implement,暫且叫ViewController,在這個protocol里我會加上一些每個UIViewController可能會用到的方法,其中一個方法叫 -(void)reloadView,這個方法是用來重新call當(dāng)前頁面的網(wǎng)絡(luò)請求,簡單說就是用戶按下placeholder頁面上重新加載的button,會調(diào)用當(dāng)前ViewController里的reloadView方法 - 在重新加載網(wǎng)絡(luò)請求成功后,發(fā)送一個
notification
去除placeholder機(jī)制:
- 在
BaseViewController里,我們會observe網(wǎng)絡(luò)請求成功的notification,然后隱藏當(dāng)前ViewController的placeholder
完整demo代碼如下:
BaseViewController.m
- (void)handleErrorMessage:(NSError *)error
{
// ViewController network request failed
if (error.code == -1009) {
[self showNetworkLostPlaceholder];
}
}
#pragma mark - <Network Success Notification>
- (void)requestSuccess:(NSNotification *)notification
{
// ViewController network request successfully
[self hideNetworkLostPlaceholder];
}
#pragma mark - <Placeholder Delegate>
- (void)reloadButtonClicked
{
// placeholder page reload button clicked
if ([(id<ViewController>)self respondsToSelector:@selector(reloadView)]) {
// this will make current UIViewController request network
[(id<ViewController>)self reloadView];
}
}
ViewController.h
@protocol ViewController <NSObject>
@optional
- (void)reloadView;
@end
轉(zhuǎn)載請注明出處,原文地址:http://kobedai.me/p9rsts-6e/