Reachability的使用和方法介紹和NSAssert、NSParameterAssert的使用
前言:
APP 開的過程中,網路佔有主要的地位,同時,網路的變化時我們應該做出什麼樣的處理,這也是很重要的。有得時候APP開發我們都忘記處理網路變化的事件。今天,我就簡單介紹網路變化的監控。
效果:效果展示
正文:程式碼的進入
//
// ViewController.m
// NetAlert
//
// Created by 周雙建 on 16/4/15.
// Copyright © 2016年周雙建. All rights reserved.
//
#import "ViewController.h"
#import "Reachability.h"
@interface ViewController ()
@property (nonatomic)Reachability *hostReachability;
@property(nonatomic,strong)UIView * AllscreenView;
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(reachabilityChanged:)name:kReachabilityChangedNotification
// 用可用的網站地址,設定檢查站點
self.hostReachability = [ReachabilityreachabilityWithHostName:@"www.baidu.com"];
[self.hostReachabilitystartNotifier];
Reachability * internetReach = [ReachabilityreachabilityForInternetConnection];
[internetReach startNotifier];
Reachability * wifiReach = [Reachability
[wifiReach startNotifier];
/*!
* + (instancetype)reachabilityWithHostName:(NSString *)hostName;
* @ hostName 是你設定的站點的網址(一般用百度,也可以使用其他的)
*/
/*!
* + (instancetype)reachabilityForInternetConnection;
* Checks whether the default route is available. Should be used by applications that do not connect to a particular host.
* 這是隨機選擇可用的路由,作為檢查站點
* 例子:
* Reachability * KReachability = [Reachability reachabilityForInternetConnection];
*/
/*!
* + (instancetype)reachabilityForLocalWiFi;
* 這是選擇區域性的wifi作為檢查站點
* 例子:
* Reachability * KReachability = [Reachability reachabilityForLocalWiFi];
*/
/*!
* + (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress;
* 這是使用一個指定的IP作為網路的檢查站點
* 例子:
* Reachability * KReachability = [Reachability reachabilityWithAddress:@"121.1268.2.1"];
*/
/*************************************************************************************/
/*!
* 下面兩個方法的解釋
* Start listening for reachability notifications on the current run loop.
*/
/*!
* - (BOOL)startNotifier
* 開啟網路變化監控
* 例子:
* [KReachability startNotifier];
*/
[self.hostReachabilitystartNotifier];
/*!
* - (void)stopNotifier
* 停止網路變化,監控
* 例子:
* [KReachability stopNotifier];
*/
[self.hostReachabilitystopNotifier];
/*************************************************************************************/
// 得到網路檢查的物件,首先,我們要獲取網路是什麼狀態
/*!
* - (NetworkStatus)currentReachabilityStatus
* 這是獲取網路的狀態
typedef enum : NSInteger {
NotReachable = 0, // 無網路
ReachableViaWiFi, // wifi 網路狀態下
ReachableViaWWAN // G、E網路狀態下
} NetworkStatus;
*/
switch (self.hostReachability.currentReachabilityStatus) {
caseNotReachable:{
NSLog(@"無網路連線");
_AllscreenView = [[UIViewalloc]initWithFrame:CGRectMake(10,20, self.view.bounds.size.width-20,40)];
_AllscreenView.layer.borderWidth =0.5;
_AllscreenView.layer.cornerRadius =10;
_AllscreenView.layer.backgroundColor = [[UIColorlightTextColor] colorWithAlphaComponent:0.6].CGColor;
CATransition * Animation = [CATransitionanimation];
Animation.type = kCATransitionPush;
Animation.timeOffset = 2;
UILabel * ScreenLabel = [[UILabelalloc]initWithFrame:CGRectMake(0,0, CGRectGetWidth(_AllscreenView.frame),40)];
ScreenLabel.textAlignment = NSTextAlignmentCenter;
ScreenLabel.text = @"你網路異常,請檢查網路";
ScreenLabel.textColor = [UIColorredColor];
[_AllscreenView addSubview:ScreenLabel];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[_AllscreenView.layeraddAnimation:Animation forKey:nil];
[[UIApplicationsharedApplication].keyWindowaddSubview:_AllscreenView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[_AllscreenView removeFromSuperview];
});
});
// 進行APP頁面跳轉
NSURL*url =[NSURLURLWithString:@"prefs:root=WIFI"];
[[UIApplicationsharedApplication] openURL:url];
}
break;
caseReachableViaWWAN:{
NSLog(@"G網路狀態下");
UIAlertController * AlertController = [UIAlertControlleralertControllerWithTitle:@"溫馨提示"message:@"您在G網路下,是否繼續"preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction * SureAction = [UIAlertActionactionWithTitle:@"確定"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction *_Nonnull action) {
// 在G網路狀態可以的情況下,但是就是沒有網路連線
/*!
* - (BOOL)connectionRequired;
* WWAN may be available, but not active until a connection has been established. WiFi may require a connection for VPN on Demand.
* 例子:
* BOOL Content = [KReachability connectionRequired];
*/
BOOL Content = [self.hostReachabilityconnectionRequired];
if (!Content) {
NSLog(@"網路轉接失敗");
}
}];
UIAlertAction * CancleAction = [UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:^(UIAlertAction *_Nonnull action) {
}];
[AlertController addAction:CancleAction];
[AlertController addAction:SureAction];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
[self presentViewController:AlertController animated:YEScompletion:nil];
});
}
break;
caseReachableViaWiFi:{
NSLog(@"Wifi狀態下");
NSURL*url =[NSURLURLWithString:@"prefs:root=WIFI"];
[[UIApplicationsharedApplication] openURL:url];
}
break;
default:
break;
}
BOOL TestBool = YES;
NSAssert(TestBool, @"發生警告");
// Do any additional setup after loading the view, typically from a nib.
}
// 網路監控變化
-(void)reachabilityChanged:(NSNotification*)Notification{
// 獲取觀察物件
Reachability *curReach = [Notification object];
// 獲取一個斷言控制代碼,如果條件成立,程式可執行,否則,程式會丟擲異常
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
[selfupdateInterfaceWithReachability:curReach];
}
- (void)updateInterfaceWithReachability:(Reachability *)curReach{
if (curReach == self.hostReachability) {
NSLog(@"網路發生變化了");
}
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)dealloc{
// 移除觀察者
[[NSNotificationCenterdefaultCenter] removeObserver:kReachabilityChangedNotificationname:nilobject:self];
}
@end
友情客串 一: NSAssert
NSAssert:
NSAssert()只是一個巨集,用於開發階段除錯程式中的Bug,通過為NSAssert()傳遞條件表示式來斷定是否屬於Bug,滿足條件返回真值,程式繼續執行,如果返回假值,則丟擲異常,並切可以自定義異常描述。NSAssert()是這樣定義的:
#define NSAssert(condition, desc)
condition是條件表示式,值為YES或NO;desc為異常描述,通常為NSString。當conditon為YES時程式繼續執行,為NO時,則丟擲帶有desc描述的異常資訊。NSAssert()可以出現在程式的任何一個位置。
使用:(介紹錯誤的使用)BOOL TestBool =NO;
NSAssert(TestBool,@"發生警告");
丟擲的異常第二:NSParameterAssert
NSParameterAssert
斷言評估一個條件,如果條件為 false ,呼叫當前執行緒的斷點控制代碼。每一個執行緒有它自已的斷點控制代碼,它是一個 NSAsserttionHandler 類的物件。當被呼叫時,斷言控制代碼列印一個錯誤資訊,該條資訊中包含了方法名、類名或函式名。然後,它就丟擲一個 NSInternalInconsistencyException 異常。
(官方:Assertions evaluate a condition and, if the condition evaluates to false, call the assertion handler for the current thread, passing it a format string and a variable number of arguments. Each thread has its own assertion handler, which is an object of
classNSAssertionHandler. When invoked, an assertion handler prints an error message that includes method and class names (or the function name). It then raises anNSInternalInconsistencyException exception.)
這個巨集用於確認一個 Objective-C 的方法的有效性。簡單提供引數作為條件就行。該巨集評估這個引數,如果為 false ,它就列印一個錯誤日誌資訊,該資訊包含了引數並且丟擲一個異常。
(官方:This macro validates a parameter for an Objective-C method. Simply provide the parameter as the condition argument.
The macro evaluates the parameter and, if it is false, it logs an error message that includes the parameter and then raises an exception.)
如果定義了預處理巨集 NS_BLOCK_ASSERTIONS 斷言就被禁止了。所有的斷點巨集都返回 void。
(官方:Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return
void.)
使用:
Reachability *curReach = [Notification object];
// 獲取一個斷言控制代碼,如果條件成立,程式可執行,否則,程式會丟擲異常
NSParameterAssert([curReach isKindOfClass:[NSString class]]);
[selfupdateInterfaceWithReachability:curReach];
相關推薦
Reachability的使用和方法介紹和NSAssert、NSParameterAssert的使用
前言: APP 開的過程中,網路佔有主要的地位,同時,網路的變化時我們應該做出什麼樣的處理,這也是很重要的。有得時候APP開發我們都忘記處理網路變化的事件。今天,我就簡單介紹網路變化的監控。 效果:效果展示 正文:程式碼的進入 // // ViewCont
Scanner的概述和方法介紹
數據 tint sys 標記 strong new can 取字符 col Scanner的概述和方法介紹 一:Scanner的構造方法原理 1.Scanner(InputStream source) 構造一個新的 Scanner,它
IntelliJ IDEA 緩存和索引介紹和清理方法
and 解決 控制 會有 介紹 查找 搜索 log 歷史 IntelliJ IDEA 的緩存和索引主要是用來加快文件查詢,從而加快各種查找、代碼提示等操作的速度。但是,IntelliJ IDEA 的索引和緩存並不是一直會良好地支持 IntelliJ IDEA 的,這某些特殊
linux下常見內存異常查證工具和方法介紹
linux 內存異常 efence 函數棧linux下常見內存異常查證工具和方法介紹內存異常導致的異常往往很難查證,本文介紹在linux下的各種常見內存異常的查證工具和方法。1、訪問空指針/未初始化指針這個是最簡單的內存異常了,只要能夠生成coredump文件,可以快速定位問題代碼。開啟coredump部分
Python中遍歷pandas資料的幾種方法介紹和效率對比說明
前言 Pandas是python的一個數據分析包,提供了大量的快速便捷處理資料的函式和方法。其中Pandas定義了Series 和 DataFrame兩種資料型別,這使資料操作變得更簡單。Series 是一種一維的資料結構,類似於將列表資料值與索引值相結合。DataFrame 是一種二維
Java記憶體區域(堆區、虛擬機器棧、本地方法棧、程式計數器和方法區)和GC機制
目錄 Java垃圾回收概況 Java記憶體區域 Java物件的訪問方式 Java記憶體分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況 Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C
js--Object.prototype下的方法介紹和使用
hasOwnProperty hasOwnProperty() 方法會返回一個布林值,指示物件自身屬性中是否具有指定的屬性 不考慮繼承裡的屬性。 o = new Object();
ConcurrentLinkedQueue使用和方法介紹
定義 一個基於連結節點的無界執行緒安全佇列。此佇列按照 FIFO(先進先出)原則對元素進行排序。佇列的頭部 是佇列中時間最長的元素。佇列的尾部 是佇列中時間最短的元素。 新的元素插入到佇列的尾部,佇列獲取操作從佇列頭部獲得元素。當多個執行緒共享訪問一個公共 collec
2.01_常見物件(Scanner的概述和方法介紹)
12.01_常見物件(Scanner的概述和方法介紹)(掌握) A:Scanner的概述 B:Scanner的構造方法原理 Scanner(InputStream source) System類下有一個靜態的欄位:
JDBCTemplate---方法介紹和簡單示例
當sql等查詢方式不能滿足效能或靈活性的要求,必須使用SQL時,大家有三種選擇: 第一、使用Hibernate 的sql 查詢函式,將查詢結果物件轉為Entity物件。 第二、使用Hibernate Session的getConnection 獲得JDBC
Java快取Ehcache-核心類和方法介紹及程式碼例項
Ehcache中核心類和方法 EhCache裡面有一個CacheManager型別,它負責管理cache。Cache裡面儲存著Element物件,Element必須是key-value對。Cache是實際物理實現的,在記憶體中或者磁碟。這些元件的邏輯表示就是下面即將要討論
Android EditText的屬性和方法介紹使用及值得注意的點
一、EditView屬性詳細介紹: 屬性名稱 描述 android:utoLink 設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。 可選值(none/web/email/phone/map/all)。 這裡只有在同時設定tex
setuptools 和easy_install介紹和安裝方法
一 setuptools 和easy_install setuptools:setuptools 是一組由PEAK(Python Enterprise Application Kit)開發的 Python 的 distutils 工具的增強工具,可以讓程式設計師更方
SVG DOM常用屬性和方法介紹(1)
12.2 SVG DOM常用屬性和方法介紹 將以Adobe SVG Viewer提供的屬性和方法為準,因為不同解析器對JavaScript以及相關的屬性和方法支援的程度不同,有些方法和屬性是某個解析器所特有的。SVG支援DOM2標準。 12.2.1 文件初始化相關 — ev
函數屬性和方法:length和prototype
scrip spa ont pan div blog 屬性 col 方法 ECMAScript中的函數是對象,因此函數也有屬性和方法。每個函數都包含兩個屬性:ength和prototype。 其中, length屬性表示函數希望接收的命名參數的個數 . function
MyBatis常用物件SqlSessionFactory和SqlSession介紹和運用
前言: 學習框架一個比較好的路徑閱讀原始碼.本文介紹的SqlSessionFactory和SqlSession.可以通過了解SqlSessionFactory介面和SqlSession介面以及兩個的實現類入手,去看原始碼瞭解實現過程.最好能把專案下載到本地,慢
Servlet的幾個方法介紹(init() 、service()、doGet() 、doPost()、destroy()、getServletConfig()、getServletInfo())
HTTPServlet 使用一個 HTML 表單來發送和接收資料。要建立一個 HTTPServlet,請擴充套件 HttpServlet 類, 該類是用專門的方法來處理 HTML 表單的 GenericServlet 的一個子類。 HTML 表單是由 <form&
經典vim外掛功能說明、安裝方法和使用方法介紹
8 #============================================================================= 9 1. 檢視 key 相關資訊說明的命令 :help keycodes 10 11 #=========================
Ajax核心XMLHttpRequest物件、(傳送請求、接收)方法和屬性介紹、AJAX開發框架、資料格式提要(XML、JSON、HTML)
Ajax核心XMLHttpRequest物件、(傳送請求、接收)方法和屬性介紹、AJAX開發框架、資料格式提要(XML、JSON、HTML) XMLHttpRequest物件 XMLHttpRequest物件在大部分瀏覽器上已經實現而且擁有一個簡單的介面允許資料從客戶端傳遞到服務端,但並不會打斷使用
Linux 查看磁盤分區、文件系統、磁盤的使用情況相關的命令和工具介紹
rfs partition pan 包含 logical cor name blocks 為什麽 Linux 磁盤分區表、文件系統的查看、統計的工具很多,有些工具是多功能的,不僅僅是查看磁盤的分區表,而且也能進行磁盤分區的操作;但在本文,我們只講磁盤分區的查看,以及分區的