app中無網路頁面的新增

coder小鵬發表於2018-01-01

前言

在開發app的過程中,為了能有更好的使用者體驗,往往會加入沒有網路時的頁面展示,告訴使用者當前的網路狀態不可用,那麼具體如何來實現實時監測網路狀態的呢,就是我們接下來要討論的問題了。

實現思路

我的實現思路大致如下:採用第三方庫RealReachability監聽網路狀態的變化,然後在基類中新增監聽,然後在基類中提供對外的方法,用來判斷當前的網路狀態,以便子類可以在不同的網路狀態時做出對應的操作。最後自定義一個無網路介面,在沒有連結網路時,新增到介面上,有網路時重新進行資料請求,並移除無網路介面即可。

具體操作

1.專案中新增第三方庫—— RealReachability,這裡我就不多做介紹,大家應該都會新增,不會的可以點此,這裡會有比較詳細的說明;

2.在appdelegate開啟全域性網路監測,具體程式碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    //開啟網路監測
    [GLobalRealReachability startNotifier];
    return YES;
}
複製程式碼

3.定義一個列舉,用來表示網路連結的三種狀態,同時定義一個變數,用來判斷當前的網路狀態,具體如下:

typedef NS_ENUM(NSUInteger, XSWNetWorkStatus) {
    
    XSWNetWorkStatusNoInternet,//沒有網路
    XSWNetWorkStatusFlow,//流量連線
    XSWNetWorkStatusWifi //wifi連結
};
//網路狀態
@property (nonatomic,assign) XSWNetWorkStatus netStatus;
複製程式碼

4.在基類中給通過RealReachability 給netStatus變數賦值,並新增監聽,用來監測網路狀態的變化,具體操作如下:

RealReachability *reachability = [RealReachability sharedInstance];
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    switch (status) {
        case 0:
        {
            _netStatus = XSWNetWorkStatusNoInternet;
        }
            break;
        case 1:{
            
            _netStatus = XSWNetWorkStatusFlow;
        }
            break;
        case 2:{
            
            _netStatus = XSWNetWorkStatusWifi;
        }
            break;
        default:
            break;
    }
    //監聽網路狀態
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(networkChanged:)
                                                 name:kRealReachabilityChangedNotification
                                               object:nil];
複製程式碼

5.實現監聽回撥事件,給netStatus賦值,並提供對外的方法,便於子類對不同的網路狀態的處理,具體操作如下:

#pragma mark ==================監聽事件的回撥==================
- (void)networkChanged:(NSNotification *)notification
{
    RealReachability *reachability = (RealReachability *)notification.object;
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    switch (status) {
        case 0:
        {
            _netStatus = XSWNetWorkStatusNoInternet;
            [self monitorNetStateChanged:0];
        }
            break;
        case 1:{
            
            _netStatus = XSWNetWorkStatusFlow;
            [self monitorNetStateChanged:1];
        }
            break;
        case 2:{
            
            _netStatus = XSWNetWorkStatusWifi;
            [self monitorNetStateChanged:2];
        }
            break;
        default:
            break;
    }
}
#pragma mark ==================網路狀態改變==================
-(void)monitorNetStateChanged:(NSInteger)netState {
    
    //子類實現
}
複製程式碼
  1. 子類重寫monitorNetStateChanged:(NSInteger)netState方法,針對當前的網路狀態,做出相應的操作即可,具體程式碼如下:
#pragma mark ==================網路狀態的判斷==================
-(void)monitorNetStateChanged:(NSInteger)netState {
    
    if (netState == 0) {
        
        //沒有網路 展示沒有網路介面,或是提示使用者當前網路狀態不可用
        
    }else{
        
        //有網,移除無網路介面,重新進行資料請求
       
    }
    
}
複製程式碼

至此,沒有網路介面的新增就說完了,如果大家有更好的實現方法或者是對我說的方法有任何的疑問,歡迎留言,我會在第一時間回覆大家。最後,將我寫的一個小demo附上,點此檢視

相關文章