1. 程式人生 > >Reachability的使用和方法介紹和NSAssert、NSParameterAssert的使用

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

object:nil];

// 用可用的網站地址,設定檢查站點

self.hostReachability = [ReachabilityreachabilityWithHostName:@"www.baidu.com"];

    [self.hostReachabilitystartNotifier];

Reachability * internetReach = [ReachabilityreachabilityForInternetConnection];

    [internetReach startNotifier];

    Reachability * wifiReach = [Reachability

reachabilityForLocalWiFi] ;

    [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      // GE網路狀態下

         } 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的使用方法介紹NSAssertNSParameterAssert的使用

前言:  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

函數屬性方法:lengthprototype

scrip spa ont pan div blog 屬性 col 方法 ECMAScript中的函數是對象,因此函數也有屬性和方法。每個函數都包含兩個屬性:ength和prototype。 其中, length屬性表示函數希望接收的命名參數的個數 . function

MyBatis常用物件SqlSessionFactorySqlSession介紹運用

前言: 學習框架一個比較好的路徑閱讀原始碼.本文介紹的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開發框架資料格式提要(XMLJSONHTML)

Ajax核心XMLHttpRequest物件、(傳送請求、接收)方法和屬性介紹、AJAX開發框架、資料格式提要(XML、JSON、HTML) XMLHttpRequest物件    XMLHttpRequest物件在大部分瀏覽器上已經實現而且擁有一個簡單的介面允許資料從客戶端傳遞到服務端,但並不會打斷使用

Linux 查看磁盤分區文件系統磁盤的使用情況相關的命令工具介紹

rfs partition pan 包含 logical cor name blocks 為什麽 Linux 磁盤分區表、文件系統的查看、統計的工具很多,有些工具是多功能的,不僅僅是查看磁盤的分區表,而且也能進行磁盤分區的操作;但在本文,我們只講磁盤分區的查看,以及分區的