大家在開發APP的時候總會碰到call接口網絡超時或者網絡丟失的情況,那么這種情況下比較好的用戶體驗是在當前頁面展示一個占位符,占位符上有重新刷新頁面的按鈕讓用戶可以重新刷新頁面,效果如下:
WechatIMG59.jpeg
給頁面加一個占位符是很簡單的,但是怎么做一個全局的占位符機制是我們需要做的,因為任何頁面都有可能觸發這個機制,如果對所有的ViewController
都加一個占位符的方法,會顯得很多余。我對這個機制的做法是這樣的:
添加placeholder機制:
- 在項目里我會有一個UIViewController的基類,叫做BaseViewController,項目里所有業務相關的UIViewController都會基于這個BaseViewController,在這個基類里,我加了一個方法叫
handleErrorMessage:(NSError *)error
,這個方法會處理網絡請求返回的錯誤信息,在AFNetworking里當errorCode是-1009的時候代表網絡丟失,這種情況下,我們將要給當前的ViewController
加上網絡丟失的placeholder
網絡請求重新加載機制:
- 首先,在項目里我會有一個
protocol
給所有的ViewController
可以implement,暫且叫ViewController
,在這個protocol
里我會加上一些每個UIViewController
可能會用到的方法,其中一個方法叫 -(void)reloadView
,這個方法是用來重新call當前頁面的網絡請求,簡單說就是用戶按下placeholder頁面上重新加載的button,會調用當前ViewController
里的reloadView
方法 - 在重新加載網絡請求成功后,發送一個
notification
去除placeholder機制:
- 在
BaseViewController
里,我們會observe網絡請求成功的notification
,然后隱藏當前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
轉載請注明出處,原文地址:http://kobedai.me/p9rsts-6e/