iOS學習之第三方-AFNetworking1.3.0

来源:http://www.cnblogs.com/gfxxbk/archive/2016/05/28/5537926.html
-Advertisement-
Play Games

將 CocoaPods 安裝後,按照 CocoaPods 的使用說明就可以將 AFNetworking 第三方集成到工程中,具體請看上篇博客iOS學習46之第三方CocoaPods的安裝和使用(通用方法) AFNetworking簡介 AFNetworking是一個 在iOS開發中 使用非常多網路開 ...


將 CocoaPods 安裝後,按照 CocoaPods 的使用說明就可以將 AFNetworking 第三方集成到工程中,具體請看上篇博客iOS學習46之第三方CocoaPods的安裝和使用(通用方法)

AFNetworking簡介

  • AFNetworking是一個 在iOS開發中 使用非常多網路開源庫,是一個輕量級的網路請求API類庫。

  • 適用於iOS以及Mac OS X。它構建於在(Apple iOS開發文檔) NSURLSession ,  NSOperation , 以及其他熟悉的Foundation技術之上,核心代碼: AFHTTPSessionManager

  • 它擁有良好的架構,豐富的api,以及模塊化構建方式,使得使用起來非常輕鬆。

  • 官方鏈接http://cocoadocs.org/docsets/AFNetworking/1.3.0/

AFHTTPSessionManager

 AFHTTPSessionManager是核心網路請求的管理類,用於管理 GET 和 POST 請求

 AFHTTPSessionManager對象的聲明和懶載入代碼:

#import "ViewController.h"

// 網路的請求頭文件
#import <AFNetworking/AFNetworking.h>

@interface ViewController ()

/// 用於網路請求的session對象
@property (nonatomic, strong) AFHTTPSessionManager *session;

@end

@implementation ViewController
// 懶載入
- (AFHTTPSessionManager *)session
{
    if (!_session) {
        _session = [AFHTTPSessionManager manager];
        // 設置請求介面回來的時候,支持什麼類型的數據
        _session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil];
    }
    return _session;
}

@end

AFNetworking進行網路監測

 在進行網路監測的時候,首先應該先判斷網路監測是否打開,如果沒有打開,先要打開監測

- (void)startMonitoring; // 打開網路監測
- (void)stopMonitoring; // 關閉網路監測

 接下來就判斷當前的網路狀態,AFNetworking有幾種不同的網路狀態

// 幾種不同的網路狀態
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    AFNetworkReachabilityStatusUnknown          = -1, // 當前網路處於未知狀態,手機沒有信號
    AFNetworkReachabilityStatusNotReachable     = 0, // 當前網路處於未連接狀態,手機沒有開流量或開WiFi
    AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手機流量網路
    AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi狀態
};

 實例代碼:

#pragma mark - 網路監測按鈕的響應方法
- (IBAction)networkMonitoringAction:(UIButton *)sender
{
    if (!isOPen) {
        // 打開網路監測的方法
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
        isOPen = YES;
    } else {
        // 關閉網路監測
        [[AFNetworkReachabilityManager sharedManager] stopMonitoring];
        isOPen = NO;
    }
    
    // 接下來判斷當前是WiFi狀態還有3g狀態,網路不可用狀態
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"當前網路處於未知狀態,手機沒有信號");
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"當前網路處於未連接狀態,手機沒有開流量或開WiFi");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"手機流量網路");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WiFi狀態");
                break;
                
            default:
                break;
        }
    }];
}

AFNetworking的GET請求

 AFNetworking1.3.0 不再想以前一樣一個 GET 請求需要很多的類參與,這裡這需要一個 AFHTTPSessionManager 的方法就可以完成

 方法:

- (NSURLSessionDataTask *)GET:(NSString *)URLString // get請求的網址
                   parameters:(id)parameters // 拼接的參數
                     progress:(void (^)(NSProgress * _Nonnull))downloadProgress // 下載的進度
                      success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 請求成功
                      failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 請求失敗

 實例代碼:

#pragma mark - GET請求的響應方法
- (IBAction)getRequestAction:(id)sender
{
    [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" // get請求的網址
           parameters:nil // 拼接的參數
             progress:^(NSProgress * _Nonnull downloadProgress) { // 下載的進度
                 NSLog(@"下載的進度");
             } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) { // 請求成功
                 NSLog(@"請求成功");

                 // 處理數據...
                 NSDictionary *reusltDict = responseObject[@"data"];
                 NSArray *resultArray = reusltDict[@"allCity"];
                 for (NSDictionary *dict in resultArray) {
                     NSLog(@"name = %@", dict[@"name"]);
                 }
                 
             } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗
                 NSLog(@"請求失敗");
             }];
}

AFNetworking的POST請求

 同GET請求一樣,POST請求也是如此,不過POST請求需要拼接參數,一般情況下參數為一個字典

 方法:

- (NSURLSessionDataTask *)POST:(NSString *)URLString // post請求的網址
                    parameters:(id)parameters // 拼接的參數body
                      progress:(void (^)(NSProgress * _Nonnull))uploadProgress  // 上傳的進度
                       success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success // 請求成功
                       failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure // 請求失敗

 實例代碼:

#pragma mark - POST請求的響應方法
- (IBAction)postRequestAction:(id)sender
{
    NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    
    NSMutableDictionary *dict = @{
                                  @"do" : @"pri_memberlist",
                                  @"member_id" : @"zpHr2dsRvQQxYJxo2",
                                  @"workspace_id" : @"ILfYpE4Dhs2gWcuQx"
                                  }.mutableCopy;
    
    
    [self.session POST:urlStr // post請求的網址
            parameters:dict // 拼接的參數body
              progress:^(NSProgress * _Nonnull uploadProgress) { // 上傳的進度
                  NSLog(@"上傳的進度");
    }
               success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) { // 請求成功
                   NSLog(@"請求成功");
                   NSDictionary *reusltDict = responseObject[@"res"];
                   
                   NSArray *keyArray = reusltDict.allKeys;
                   
                   for (NSString *key in keyArray) {
                       NSArray *resultArray = reusltDict[key];
                       for (NSDictionary *dict in resultArray) {
                           NSLog(@"username = %@", dict[@"username"]);
                       }
                   }
    }
               failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗
                   NSLog(@"請求失敗");
    }];
}

註意:URL字元串或body體中如果有特殊字元或者中文字元,AFNETWorking並沒有做UTF8的轉碼,需要:

url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

 代碼實例:

#pragma mark - POST請求2的響應方法
- (IBAction)postRequest2Action:(id)sender
{
    NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php";
    
    NSString *commonContent = @"類模塊計劃用到第三部分中,待提問、回答積累到一定數量時,便於大家的問題的快速查找,所以提問部分暫時不加入這個";
    
    commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 當body體或URL中出現漢字時使用
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setValue:@"" forKey:@"address"];
    [dict setValue:commonContent forKey:@"comment"];
    [dict setValue:@"add_comment" forKey:@"do"];
    [dict setValue:@"task" forKey:@"kind"];
    [dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"];
    [dict setValue:@"" forKey:@"other"];
    [dict setValue:@"55a47e79ec25e3641" forKey:@"task_id"];
    
    [self.session POST:urlStr
            parameters:dict
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  NSLog(@"上傳成功");
              } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                  NSLog(@"請求成功:%@", responseObject);
              } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                  NSLog(@"請求失敗");
              }];
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發的時候,遇到了這樣一個問題,客戶填寫自己的收貨地址,可以新建,但同時也可以選擇之前填寫的,由於我們的客戶本身就是商戶,地址繁多,把它之前的地址簡單用個下拉框羅列出來顯然不合適,並且客戶要求能夠對地址通過姓名篩選,這樣,選擇地址就必須再開一個小窗來完成了,那麼,小窗中填寫的值怎麼回傳呢? js有 ...
  • 淺談對象(本筆記中截圖和部分代碼取自慕課網視頻http://www.imooc.com/learn/277第四章對象) 面向對象原型鏈繼承這塊,應該算是javascript中最難理解的部分了,小弟腦子比較難轉彎,也是看了好久視頻,博文,慢慢的才有了自己的理解,現在記錄一下學習的內容和總結。首先第一節 ...
  • 代碼整理 - uix.layout.js /** * Grace [jQuery.js] * * UIX頁面佈局 * [email protected] * exp: * $.uix.layout();//執行佈局 * class="uix-layout-container";//標識佈局容器 * c ...
  • 一、知識儲備: 1、枚舉屬性名稱的函數: (1)for...in:可以在迴圈體中遍歷對象中所有可枚舉的屬性(包括自有屬性和繼承屬性) (2)Object.keys():返回數組(可枚舉的自有屬性) (3)Object.getOwnPropertyNames():所有的自有屬性 3、屬性的特性:數據屬 ...
  • 一、什麼是HTML 1.html: HyperText Markup Language 超文本標記語言,是最基礎的網頁語言,而且都是由標簽組成。 2.基本格式: <!--StartFragment--> <html> <head> 放置一些屬性信息,輔助信息。 引入一些外部的文件。(css,java ...
  • 最近有遇到過sizeToFit的方法,比較好奇,所以查了點資料 在官方文檔中 - (void)sizeToFit; // calls sizeThatFits: with current view bounds and changes bounds size. 調用這個方法來改變當前view的大小( ...
  • 前言: 這個小項目使用到了CoreLocation框架裡面的設備朝向功能,對CoreLocation感興趣的可以翻一下之前的文章 在另一個博客站有朋友發現一個尷尬的問題(圖片的東西2個方向是不對的),原諒我的大意,趕時間就直接百度了張圖片,大家註意下就好了哈!sorry~ 指南針實現 先來看看效果 ...
  • adb shell 連接: //http://www.cnblogs.com/xiaobo-Linux/ Android把數據都存放在data/data目錄下。 我們使用cd命令轉到data/data目錄下: cd /data/data ls 命令你會看到StudDB.db,這就是我們的StudDB ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...