時間匆忙磁奖, 隨便簡單寫了個demo提交到github了:https://github.com/FrankSunDragon/NONetwork
現(xiàn)在的APP都注重用戶的體驗贡必, 所以主流的APP都有無數(shù)據(jù)界面和無網(wǎng)絡界面的顯示來提醒用戶。有一種簡單的做法能實現(xiàn)上面那種需求雹嗦,就是在每個控制器判斷是否有網(wǎng)絡范舀,沒有的話就加在無網(wǎng)絡界面合是;但臃腫的代碼顯示不是我們這些程序猿的喜愛。
經(jīng)過上網(wǎng)搜尋資料后锭环, 理清了實現(xiàn)的基本思路:
** 1聪全、給UIViewController添加類別(分類),添加無網(wǎng)絡界面控件并成為無網(wǎng)絡數(shù)據(jù)界面的代理方法和移除控件方法辅辩;
2难礼、基于某網(wǎng)絡請求框架封裝的工具類中,傳入目標控制器玫锋;
3蛾茉、網(wǎng)絡請求時,在工具類中判斷是否有網(wǎng)絡撩鹿,并實現(xiàn)相應的方法臀稚。**
1、網(wǎng)絡請求工具類
我是基于afnetworking框架寫的工具類三痰,主要是封裝了簽名認證和無網(wǎng)絡返回block的處理吧寺,而加載無網(wǎng)絡界面需要傳入目標控制器。
// 判斷是否加載網(wǎng)絡界面的普通的GET請求
+ (void)ZMG_Internet_general_getWithTarget:(nonnull UIViewController*)target modelArr:(NSArray *)modelArr url:(NSString *)url params:(NSDictionary *)params success:(void (^)(id json))success failure:(void (^)(NSError *error))failure connect:(void(^)(BOOL internet))IsAvailable;
這個方法里target參數(shù)是目標控制器散劫;
modelArr就是判斷現(xiàn)在控制器所在的view有沒有數(shù)據(jù)稚机,有數(shù)據(jù)沒有網(wǎng)絡就彈出一個HUD,沒數(shù)據(jù)沒有網(wǎng)絡的情況下,才像是無網(wǎng)絡界面获搏。
IsAvailable參數(shù)就是回調(diào)的block赖条,yes為有網(wǎng)絡,no為無網(wǎng)絡常熙;
+ (void)ZMG_Internet_general_getWithTarget:(nonnull UIViewController*)target modelArr:(NSArray *)modelArr url:(NSString *)url params:(NSDictionary *)params success:(void (^)(id json))success failure:(void (^)(NSError *error))failure connect:(void(^)(BOOL internet))IsAvailable{
//1. 檢測網(wǎng)絡
BOOL intenet = [GlobalVariables isExistenceNetwork];
if(IsAvailable){
IsAvailable(intenet);
}
if(intenet == NO){// 沒有網(wǎng)絡
if(modelArr.count>0) return;// 如果已有數(shù)據(jù)纬乍,然后沒有網(wǎng)絡
[target showNotInternetView];
}else{ // 有網(wǎng)絡
// 打印請求的路徑和參數(shù)
[target hiddenNotInternetView];
NSString* str = @"";
for (NSString *key in params) {
NSString* str2 = [[NSString alloc] initWithFormat:@"%@=%@&", key,params[key] ];
str = [str stringByAppendingString:str2];
}
// NSLog(@"%@?%@\n%@",url,str,params);
// 2.創(chuàng)建請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
mgr.requestSerializer.timeoutInterval = TIMEOUTINTERVAL;
// 3.發(fā)送請求
[mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failure) {
failure(error);
}
}];
}
}
2、 UIViewController+FDNotNetController分類
- (void)showNotInternetView
{
NSInteger tag = 0;
for (UIView* view in self.view.subviews) {
if ([view isKindOfClass:[FDNotInternetView class]]) {
tag++;
}
}
if(tag>0)
return;
CGFloat YY = 64;
if([self isKindOfClass:[FDBaseTableViewController class]]){
YY = 0;
}
FDNotInternetView * view = [[FDNotInternetView alloc] initWithFrame:CGRectMake(0, YY, SYFWidth, SYFHeight-YY)];
view.delegate = self;
[self.view addSubview:view];
}
- (void)hiddenNotInternetView
{
for (UIView* view in self.view.subviews) {
if ([view isKindOfClass:[FDNotInternetView class]]) {
[view removeFromSuperview];
}
}
}
//無網(wǎng)絡控件的代理方法
- (void) reloadNetworkRequest:(id)sender
{
if ([self respondsToSelector:@selector(reloadRequest)]) {
[self performSelector:@selector(reloadRequest)];
}
}
1裸卫、自定義無網(wǎng)絡控件
#import <UIKit/UIKit.h>
@protocol FDNotInternetViewDelegate <NSObject>
- (void)reloadNetworkRequest:(id)sender;
@end
@interface FDNotInternetView : UIView
/**
* 由代理控制器去執(zhí)行刷新網(wǎng)絡
*/
@property (nonatomic, weak) id<FDNotInternetViewDelegate>delegate;
@end
在FDNotInternetView.m文件里仿贬,點擊重新加載的實現(xiàn)方法:
- (void)reloadNetworkDataSourcer:(id)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(reloadNetworkRequest:)]) {
[self.delegate performSelector:@selector(reloadNetworkRequest:) withObject:sender];
}
}
最關鍵的一步: 要在控制器里面寫reloadRequest方法,來實現(xiàn)重新加載墓贿;