国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

IOS----輕松掌握AFN網(wǎng)絡頂級框架

2019-11-09 18:44:15
字體:
來源:轉載
供稿:網(wǎng)友

一、什么是AFN

全稱是AFNetworking,是對NSURLConnection的一層封裝雖然運行效率沒有ASI高,但是使用比ASI簡單

在iOS開發(fā)中,使用比較廣泛

AFN的github地址https://github.com/pokeb/AFNetworking/AFNetworking

二、AFN結構

NSURLConnectionAFURLConnectionOperationAFHTTPRequestOperationAFHTTPRequestOperationManager(封裝了常用的 HTTP 方法)屬性baseURL :AFN建議開發(fā)者針對 AFHTTPRequestOperationManager 自定義個一個單例子類,設置 baseURL, 所有的網(wǎng)絡訪問,都只使用相對路徑即可requestSerializer :請求數(shù)據(jù)格式/默認是二進制的 HTTPresponseSerializer :響應的數(shù)據(jù)格式/默認是 JSON 格式operationQueuereachabilityManager :網(wǎng)絡連接管理器方法manager :方便創(chuàng)建管理器的類方法HTTPRequestOperationWithRequest :在訪問服務器時,如果要告訴服務器一些附加信息,都需要在 Request 中設置GETPOSTNSURLsessionAFURLSessionManagerAFHTTPSessionManager(封裝了常用的 HTTP 方法)GETPOSTUIKit + AFNetworking 分類NSProgress :利用KVO半自動的序列化&反序列化的功能AFURLRequestSerialization :請求的數(shù)據(jù)格式/默認是二進制的AFURLResponseSerialization :響應的數(shù)據(jù)格式/默認是JSON格式附加功能安全策略HTTPSAFSecurityPolicy網(wǎng)絡檢測對蘋果的網(wǎng)絡連接檢測做了一個封裝AFNetworkReachabilityManager

三、AFN基本使用

1.AFHTTPSessionManager

是AFN中最重要的對象之一封裝了HTTP請求的常見處理GET/POST請求解析服務器的響應數(shù)據(jù)

創(chuàng)建AFHTTPSessionManager

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

AFHTTPSessionManager的GET/POST請求

// GET請求/* http://120.25.226.186:32812/login?username=520it&pwd=520it 第一個參數(shù): 請求的地址 http://120.25.226.186:32812/login 第二個參數(shù): 請求的參數(shù) username=520it&pwd=520it 第三個參數(shù): 請求成功的回調 第四個參數(shù): 請求失敗的回調 只要利用AFN發(fā)送請求, 如果服務器返回的是JSON數(shù)據(jù), 那么AFN會自動將JSON轉會成OC對象返回給我們 */- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responSEObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure// POST請求- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代碼示例

// GET- (void)get2{ // 1.創(chuàng)建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN管理者發(fā)送請求 NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"請求成功---%@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"請求失敗---%@", error); }];}// POST- (void)post2{ // 1.創(chuàng)建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN管理者發(fā)送請求 NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"請求成功---%@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"請求失敗---%@", error); }];}

2.AFHTTPRequestOperationManager

創(chuàng)建AFHTTPRequestOperationManager

// 1.創(chuàng)建AFN管理者 // AFHTTPRequestOperationManager內部包裝了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

AFHTTPRequestOperationManager的GET/POST請求

// GET- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure// POST請求- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

代碼示例

- (void)get{ // 1.創(chuàng)建AFN管理者 // AFHTTPRequestOperationManager內部包裝了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者發(fā)送請求 NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"請求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"請求失敗---%@", error); }];}- (void)post{ // 1.創(chuàng)建AFN管理者 // AFHTTPRequestOperationManager內部包裝了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者發(fā)送請求 NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"請求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"請求失敗---%@", error); }];}

四、AFN文件下載

// 執(zhí)行下載文件的方法,可以監(jiān)控下載進度- (void)downLoadMonitor{ // 1.創(chuàng)建網(wǎng)絡管理者 // AFHTTPSessionManager 基于NSURLSession AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用網(wǎng)絡管理者下載數(shù)據(jù) NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]]; /* destination - targetPath: 系統(tǒng)給我們自動寫入的文件路徑 - block的返回值, 要求返回一個URL, 返回的這個URL就是剪切的位置的路徑 completionHandler - url :destination返回的URL == block的返回的路徑 */ /* @property int64_t totalUnitCount; 需要下載文件的總大小 @property int64_t completedUnitCount; 當前已經(jīng)下載的大小 */ NSProgress *progress = nil; NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename]; return [NSURL fileURLWithPath:path]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"%@",filePath.absoluteString); }]; /* 要跟蹤進度,需要使用 NSProgress,是在 iOS 7.0 推出的,專門用來跟蹤進度的類! NSProgress只是一個對象!如何跟蹤進度!-> KVO 對屬性變化的監(jiān)聽! @property int64_t totalUnitCount; 總單位數(shù) @property int64_t completedUnitCount; 完成單位數(shù) */ // 給Progress添加監(jiān)聽 KVO [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil]; // 3.啟動任務 [downTask resume];}// 收到通知調用的方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount); // 回到主隊列刷新UI dispatch_async(dispatch_get_main_queue(), ^{ self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount; });}

五、AFN序列化

默認是JSON數(shù)據(jù),接收類型是JSON如果接收的類型和返回的類型不匹配會報錯 // 1.創(chuàng)建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 默認請求二進制 // 默認響應是JSON // 告訴AFN,支持接受 text/xml 的數(shù)據(jù) // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"]; // 告訴AFN如何解析數(shù)據(jù) // 告訴AFN客戶端, 將返回的數(shù)據(jù)當做JSON來處理,默認的是以JSON處理// manager.responseSerializer = [AFJSONResponseSerializer serializer]; // 告訴AFN客戶端, 將返回的數(shù)據(jù)當做XML來處理// manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; // 告訴AFN客戶端, 將返回的數(shù)據(jù)當做而進行來數(shù)據(jù) (服務器返回什么就是什么) manager.responseSerializer = [AFHTTPResponseSerializer serializer];

六、AFN文件上傳

// formData: 專門用于拼接需要上傳的數(shù)據(jù)- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

AFN上傳文件代碼示例

// 1.創(chuàng)建網(wǎng)絡管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用網(wǎng)絡管理者上傳數(shù)據(jù) NSDictionary *dict = @{@"username":@"Syl"}; // formData: 專門用于拼接需要上傳的數(shù)據(jù) [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock: ^void(id<AFMultipartFormData> formData) { /* Data: 需要上傳的數(shù)據(jù) name: 服務器參數(shù)的名稱 fileName: 文件名稱 mimeType: 文件的類型 */ UIImage *image =[UIImage imageNamed:@"minion_02"]; NSData *data = UIImagePNGRepresentation(image); [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"]; /* NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/CertificateSigningRequest.certSigningRequest"]; // 任意的二進制數(shù)據(jù)MIMEType application/octet-stream // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer" mimeType:@"application/octet-stream" error:nil]; [formData appendPartWithFileURL:url name:@"file" error:nil]; */ } success:^void(NSURLSessionDataTask * task, id responseObject) { // 請求成功 NSLog(@"請求成功 %@", responseObject); } failure:^void(NSURLSessionDataTask * task, NSError * error) { // 請求失敗 NSLog(@"請求失敗 %@", error); }];

七、監(jiān)控聯(lián)網(wǎng)狀態(tài)

1.AFN監(jiān)控聯(lián)網(wǎng)狀態(tài)

聯(lián)網(wǎng)狀態(tài)status

// 2.設置監(jiān)聽 /* AFNetworkReachabilityStatusUnknown = -1, 未識別 AFNetworkReachabilityStatusNotReachable = 0, 未連接 AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G AFNetworkReachabilityStatusReachableViaWiFi = 2, wifi */

示例代碼

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];// 提示:要監(jiān)控網(wǎng)絡連接狀態(tài),必須要先調用單例的startMonitoring方法[manager startMonitoring];[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { NSLog(@"%d", status);}];

2.Reachability監(jiān)控聯(lián)網(wǎng)狀態(tài)蘋果提供,導入這兩個類使用

// 1.檢測wifi狀態(tài) Reachability *wifi = [Reachability reachabilityForLocalWiFi]; // 2.檢測手機是否能上網(wǎng)絡(WIFI/3G/2.5G) Reachability *conn = [Reachability reachabilityForInternetConnection]; // 3.判斷網(wǎng)絡狀態(tài) if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi NSLog(@"有wifi"); } else if ([conn currentReachabilityStatus] != NotReachable) { // 沒有使用wifi, 使用手機自帶網(wǎng)絡進行上網(wǎng) NSLog(@"使用手機自帶網(wǎng)絡進行上網(wǎng)"); } else { // 沒有網(wǎng)絡 NSLog(@"沒有網(wǎng)絡"); }

①判斷聯(lián)網(wǎng)狀態(tài)

// 用WIFI// [wifi currentReachabilityStatus] != NotReachable// [conn currentReachabilityStatus] != NotReachable// 沒有用WIFI, 只用了手機網(wǎng)絡// [wifi currentReachabilityStatus] == NotReachable// [conn currentReachabilityStatus] != NotReachable// 沒有網(wǎng)絡// [wifi currentReachabilityStatus] == NotReachable// [conn currentReachabilityStatus] == NotReachable

②實時監(jiān)聽網(wǎng)絡狀態(tài)

#import "ViewController.h"#import "Reachability.h"@interface HMViewController ()@property (nonatomic, strong) Reachability *conn;@end@implementation HMViewController- (void)viewDidLoad{ [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState) name:kReachabilityChangedNotification object:nil]; self.conn = [Reachability reachabilityForInternetConnection]; [self.conn startNotifier];}- (void)dealloc{ [self.conn stopNotifier]; [[NSNotificationCenter defaultCenter] removeObserver:self];}- (void)checkNetworkState{ // 1.檢測wifi狀態(tài) Reachability *wifi = [Reachability reachabilityForLocalWiFi]; // 2.檢測手機是否能上網(wǎng)絡(WIFI/3G/2.5G) Reachability *conn = [Reachability reachabilityForInternetConnection]; // 3.判斷網(wǎng)絡狀態(tài) if ([wifi currentReachabilityStatus] != NotReachable) { // 有wifi NSLog(@"有wifi"); } else if ([conn currentReachabilityStatus] != NotReachable) { // 沒有使用wifi, 使用手機自帶網(wǎng)絡進行上網(wǎng) NSLog(@"使用手機自帶網(wǎng)絡進行上網(wǎng)"); } else { // 沒有網(wǎng)絡 NSLog(@"沒有網(wǎng)絡"); }}@end
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌拉特后旗| 西昌市| 嘉祥县| 福建省| 绿春县| 麻栗坡县| 开平市| 石阡县| 赣榆县| 桦甸市| 九台市| 永城市| 阳春市| 珲春市| 凤翔县| 湟源县| 高青县| 枣庄市| 板桥市| 化德县| 分宜县| 班玛县| 望都县| 湛江市| 当阳市| 高密市| 博爱县| 航空| 武胜县| 崇礼县| 汉阴县| 宜春市| 本溪市| 安阳县| 丽江市| 柳州市| 股票| 廉江市| 沅陵县| 商水县| 宁城县|