前言
在開發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 {
//子類實現
}
複製程式碼
- 子類重寫monitorNetStateChanged:(NSInteger)netState方法,針對當前的網路狀態,做出相應的操作即可,具體程式碼如下:
#pragma mark ==================網路狀態的判斷==================
-(void)monitorNetStateChanged:(NSInteger)netState {
if (netState == 0) {
//沒有網路 展示沒有網路介面,或是提示使用者當前網路狀態不可用
}else{
//有網,移除無網路介面,重新進行資料請求
}
}
複製程式碼
至此,沒有網路介面的新增就說完了,如果大家有更好的實現方法或者是對我說的方法有任何的疑問,歡迎留言,我會在第一時間回覆大家。最後,將我寫的一個小demo附上,點此檢視