時(shí)間匆忙, 隨便簡(jiǎn)單寫(xiě)了個(gè)demo提交到github了:https://github.com/FrankSunDragon/NONetwork

現(xiàn)在的APP都注重用戶(hù)的體驗(yàn), 所以主流的APP都有無(wú)數(shù)據(jù)界面和無(wú)網(wǎng)絡(luò)界面的顯示來(lái)提醒用戶(hù)。有一種簡(jiǎn)單的做法能實(shí)現(xiàn)上面那種需求,就是在每個(gè)控制器判斷是否有網(wǎng)絡(luò),沒(méi)有的話就加在無(wú)網(wǎng)絡(luò)界面;但臃腫的代碼顯示不是我們這些程序猿的喜愛(ài)。
經(jīng)過(guò)上網(wǎng)搜尋資料后, 理清了實(shí)現(xiàn)的基本思路:
** 1、給UIViewController添加類(lèi)別(分類(lèi)),添加無(wú)網(wǎng)絡(luò)界面控件并成為無(wú)網(wǎng)絡(luò)數(shù)據(jù)界面的代理方法和移除控件方法;
2、基于某網(wǎng)絡(luò)請(qǐng)求框架封裝的工具類(lèi)中,傳入目標(biāo)控制器;
3、網(wǎng)絡(luò)請(qǐng)求時(shí),在工具類(lèi)中判斷是否有網(wǎng)絡(luò),并實(shí)現(xiàn)相應(yīng)的方法。**
1、網(wǎng)絡(luò)請(qǐng)求工具類(lèi)
我是基于afnetworking框架寫(xiě)的工具類(lèi),主要是封裝了簽名認(rèn)證和無(wú)網(wǎng)絡(luò)返回block的處理,而加載無(wú)網(wǎng)絡(luò)界面需要傳入目標(biāo)控制器。
// 判斷是否加載網(wǎng)絡(luò)界面的普通的GET請(qǐ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;
這個(gè)方法里target參數(shù)是目標(biāo)控制器;
modelArr就是判斷現(xiàn)在控制器所在的view有沒(méi)有數(shù)據(jù),有數(shù)據(jù)沒(méi)有網(wǎng)絡(luò)就彈出一個(gè)HUD,沒(méi)數(shù)據(jù)沒(méi)有網(wǎng)絡(luò)的情況下,才像是無(wú)網(wǎng)絡(luò)界面。
IsAvailable參數(shù)就是回調(diào)的block,yes為有網(wǎng)絡(luò),no為無(wú)網(wǎng)絡(luò);
+ (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. 檢測(cè)網(wǎng)絡(luò)
BOOL intenet = [GlobalVariables isExistenceNetwork];
if(IsAvailable){
IsAvailable(intenet);
}
if(intenet == NO){// 沒(méi)有網(wǎng)絡(luò)
if(modelArr.count>0) return;// 如果已有數(shù)據(jù),然后沒(méi)有網(wǎng)絡(luò)
[target showNotInternetView];
}else{ // 有網(wǎng)絡(luò)
// 打印請(qǐ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)建請(qǐng)求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
mgr.requestSerializer.timeoutInterval = TIMEOUTINTERVAL;
// 3.發(fā)送請(qǐng)求
[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分類(lèi)
- (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ú)網(wǎng)絡(luò)控件的代理方法
- (void) reloadNetworkRequest:(id)sender
{
if ([self respondsToSelector:@selector(reloadRequest)]) {
[self performSelector:@selector(reloadRequest)];
}
}
1、自定義無(wú)網(wǎng)絡(luò)控件
#import <UIKit/UIKit.h>
@protocol FDNotInternetViewDelegate <NSObject>
- (void)reloadNetworkRequest:(id)sender;
@end
@interface FDNotInternetView : UIView
/**
* 由代理控制器去執(zhí)行刷新網(wǎng)絡(luò)
*/
@property (nonatomic, weak) id<FDNotInternetViewDelegate>delegate;
@end
在FDNotInternetView.m文件里,點(diǎn)擊重新加載的實(shí)現(xiàn)方法:
- (void)reloadNetworkDataSourcer:(id)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(reloadNetworkRequest:)]) {
[self.delegate performSelector:@selector(reloadNetworkRequest:) withObject:sender];
}
}
最關(guān)鍵的一步: 要在控制器里面寫(xiě)reloadRequest方法,來(lái)實(shí)現(xiàn)重新加載;
