封裝全局的無(wú)網(wǎng)絡(luò)界面

時(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)重新加載;



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,694評(píng)論 4 61
  • 原文鏈接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影閱讀 33,172評(píng)論 6 472
  • 1、看到這個(gè)問(wèn)題我的第一反應(yīng)是到底選擇讓誰(shuí)上車(chē),真的很難取舍。文中最后的答案讓人眼前一亮(我怎么就沒(méi)想到呢?),橫...
    青墨QINGMO閱讀 162評(píng)論 0 1

友情鏈接更多精彩內(nèi)容