OC+Swift語言封裝AFN網(wǎng)絡(luò)請求工具

網(wǎng)絡(luò)請求工具是我們經(jīng)常用到的工具類,下面用OC語言和Swift語言封裝AFNetworking網(wǎng)絡(luò)請求工具,廢話不多說,直接上代碼。


OC語言封裝AFN網(wǎng)絡(luò)請求工具

  • 創(chuàng)建類NetworkTool,繼承AFHTTPSessionManager
.h文件
#import <Foundation/Foundation.h>
#import "AFNetworking.h"
@interface NetworkTool : AFHTTPSessionManager
//創(chuàng)建單例
+ (instancetype)sharedTool;
 //網(wǎng)絡(luò)請求方法
- (void)requestWithURL:(NSString *)url parameters: (NSDictionary *)parameters method: (NSString *)method callBack: (void(^)(id responseObject))callBack;
@end
.m文件--分兩種方法實現(xiàn)
1.先來個普通的實現(xiàn)方法
#import "NetworkTool.h"
@implementation NetworkTool
//單例實現(xiàn)
+ (instancetype)sharedTool{
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    instance = [[self alloc]init];
});
return instance;
}

-(void)requestWithURL:(NSString *)url parameters:(NSDictionary *)parameters method:(NSString *)method callBack:(void (^)(id))callBack{
 //判斷發(fā)送的是什么請求
 //GET請求
   if([method isEqualToString:@"GET"]) {
    [self GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        callBack(responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
   }
    //POST請求
    if ([method isEqualToString:@"POST"]) {
        [self POST:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            callBack(responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@",error);
        }];
    }
}
@end
2.參考到AFN內(nèi)部POST,GET等請求都是用同一個方法實現(xiàn):dataTaskWithHTTPMethod,我們來封裝一下
  • 由于AFN內(nèi)部的dataTaskWithHTTPMethod方法時私有的,我們?nèi)绻蛔鎏幚碓谶@里無法使用的
  • 如何使用父類的私有方法?---利用OC運行時,當發(fā)送消息調(diào)用方法時在本類中找不到該方法,則會去父類中調(diào)用
     #import "NetworkTool.h"
     //1.創(chuàng)建協(xié)議,聲明協(xié)議方法,把AFN內(nèi)部的實現(xiàn)方法復制過來
     @protocol OCNetworkToolProtocol <NSObject>
     - (NSURLSessionDataTask  *)dataTaskWithHTTPMethod:(NSString *)method
                                   URLString:(NSString *)URLString
                                  parameters:(id)parameters
                              uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
                            downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
                                     success:(void (^)(NSURLSessionDataTask *, id))success
                                     failure:(void (^)(NSURLSessionDataTask *, NSError *))failure;
     @end

     //2.遵守協(xié)議
     @interface NetworkTool()<OCNetworkToolProtocol>
     @end
      //然后就可以調(diào)用了
     @implementation NetworkTool
     //單例實現(xiàn)
     + (instancetype)sharedTool{
     static id instance = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
     instance = [[self alloc]init];
     });
     return instance;
     }

     -(void)requestWithURL:(NSString *)url parameters:(NSDictionary *)parameters method:(NSString *)method callBack:(void (^)(id))callBack{
     //如果使用父類的dataTask方法(由于是父類的私有方法,所以調(diào)用不了,這時要使用代理),則不用判斷
     NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:method URLString:url parameters:parameters uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        callBack(responseObject);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
       }];
  • 使用哪種看個人愛好,目的都是一樣的。

Swift語言封裝AFN網(wǎng)絡(luò)請求工具

  • 創(chuàng)建類繼承AFHTTPSessionManager
import Foundation
class SwiftNetworkTool: AFHTTPSessionManager {
//創(chuàng)建單例
static let shared = SwiftNetworkTool()
//網(wǎng)絡(luò)工具方法
func reqeust(url: String, paramaters: [String: Any]? = nil, method: String, callBack:@escaping (_ responseObject:Any?)->()){
    
    //抽取請求成功和失敗的閉包
    let success = {
        (task: URLSessionDataTask, responseObject: Any?) in callBack(responseObject)
    }
    let failure = {
        (task: URLSessionDataTask?,error: Error) in
        callBack(nil)
    }
    
    //GET請求網(wǎng)絡(luò)數(shù)據(jù)
    if method == "GET" {
        self.get(url, parameters: paramaters, progress: nil, success: success, failure: failure)
    }
    //POST請求網(wǎng)絡(luò)數(shù)據(jù)
    if method == "POST" {
        self.post(url, parameters: paramaters, progress: nil, success: success, failure: failure)
    }   
} 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,361評論 4 61
  • 色彩斑斕的顏色總讓我們歡喜,你喜歡什么色調(diào)呢? 暖色調(diào)、冷色調(diào)、中性色調(diào)? 去過幼兒園的人都知道,幼兒園的裝修是屬...
    蕭雅琴子閱讀 285評論 0 0
  • 關(guān)于人生所謂寬容,不是忍受或者忽略,而是終于懂得欣賞。 駐足間,會有欣喜,不一定是眼中看到的,而是內(nèi)心的感受: 丈...
    意水閱讀 627評論 0 1
  • “媽,今年夏天好熱,我快要中暑了?!?“兒子,中暑了?快點喝一瓶藿香正氣水。” 如果我看見這位大媽,真想反手就給你...
    十月七107閱讀 732評論 0 1
  • 官網(wǎng) 功能提供簡單的注解來消除冗余的java代碼? idea配置idea提供了lombok插件,首先在plugin...
    xdlkc閱讀 392評論 0 0

友情鏈接更多精彩內(nèi)容