iOS開發之網絡請求(基於AFNetworking的再封裝)

最近一直很忙也沒有什麼時間寫博客了。放假了休息一下,就寫一篇博客來總結一下最近作項目中出現過的問題吧!!!html

首先,在項目中個人起到了什麼做用,無非就是把美工(UI設計師)給咱們的圖顯示出來,而後再和服務器進行交互。git

那個咱們和服務器怎麼交互呢?最簡單的方式就是說話唄,可是咱們要跟服務器說話必須經過咱們彼此能聽的懂的話來交流,也就須要制定不少的協議了(http,tcp,udp等,這個有興趣的朋友能夠了解一下網絡協議的東西)。可是我日常最常使用的仍是http協議。github

http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html這篇博客詳細講解了http協議的東西(我能說是我隨便百度了一篇博客嗎?)服務器

而後github上的AFNetworking應該如今是應用的最普遍的網絡請求三方庫了吧。那麼今天就來講一下AFNetworing。網絡

既然人家已經封裝的這麼好了,咱們爲何還要畫蛇添足再封裝呢?併發

那如今就來講一下再封裝的意義是什麼?app

最重要的意義差很少就是統一接口(這個也是封裝的一個做用,若是不瞭解封裝的同窗能夠去看看封裝的用處,是個提升效率的很是有效的辦法),這一點要是再多人項目中尤爲能體現出來,個人一個同事用的是系統自帶的MKNetworking,不少人可能聽都沒聽過,他雖然用的很好,我也能看的懂,可是仍是感受看起來很難受,由於我根本不想看到他的具體用法和實現是什麼樣子的(雖然真正敲起來可能也只是多了兩行代碼而已),只須要調一個接口就什麼都用了不就行了,爲何還要敲那麼多重複的代碼呢(Don't repeat yourself)?tcp

好,下面我就來對AFNetworking再封裝:post

首先,仍是說一下封裝的事情,若是是你本身用,那麼你能夠隨便寫一寫,由於你不用註釋也能看的懂。可是若是是給幾我的用,你能夠直接告訴他們,或者說是寫一個比較詳細的註釋,以便他們往後忘記了看一下就知道每一個參數的意義是什麼了!!!我將網絡請求封裝成了單例,詳細代碼見下:atom

那麼我在網絡請求的時候究竟最經常使用的網絡請求有哪些呢?

我最經常使用到的就是get,post,upload及download了。(這幾中請求方式也能夠去了解一下他們的區別)

說了這麼多的廢話了來點乾貨。

上傳文件的參數文件UploadParam.h:

@interface UploadParam : NSObject
/**
 *  圖片的二進制數據
 */
@property (nonatomic, strong) NSData *data;
/**
 *  服務器對應的參數名稱
 */
@property (nonatomic, copy) NSString *name;
/**
 *  文件的名稱(上傳到服務器後,服務器保存的文件名)
 */
@property (nonatomic, copy) NSString *filename;
/**
 *  文件的MIME類型(image/png,image/jpg等)
 */
@property (nonatomic, copy) NSString *mimeType;

@end

HttpRequest.h的申明:

@class UploadParam;
/**
 *  網絡請求類型
 */
typedef NS_ENUM(NSUInteger,HttpRequestType) {
    /**
     *  get請求
     */
    HttpRequestTypeGet = 0,
    /**
     *  post請求
     */
    HttpRequestTypePost
};

@interface HttpRequest : NSObject

+ (instancetype)sharedInstance;

/**
 *  發送get請求
 *
 *  @param URLString  請求的網址字符串
 *  @param parameters 請求的參數
 *  @param success    請求成功的回調
 *  @param failure    請求失敗的回調
 */
- (void)getWithURLString:(NSString *)URLString
              parameters:(id)parameters
                 success:(void (^)(id responseObject))success
                 failure:(void (^)(NSError *error))failure;

/**
 *  發送post請求
 *
 *  @param URLString  請求的網址字符串
 *  @param parameters 請求的參數
 *  @param success    請求成功的回調
 *  @param failure    請求失敗的回調
 */
- (void)postWithURLString:(NSString *)URLString
               parameters:(id)parameters
                  success:(void (^)(id responseObject))success
                  failure:(void (^)(NSError *error))failure;

/**
 *  發送網絡請求
 *
 *  @param URLString   請求的網址字符串
 *  @param parameters  請求的參數
 *  @param type        請求的類型
 *  @param resultBlock 請求的結果
 */
- (void)requestWithURLString:(NSString *)URLString
                  parameters:(id)parameters
                        type:(HttpRequestType)type
                     success:(void (^)(id responseObject))success
                     failure:(void (^)(NSError *error))failure;

/**
 *  上傳圖片
 *
 *  @param URLString   上傳圖片的網址字符串
 *  @param parameters  上傳圖片的參數
 *  @param uploadParam 上傳圖片的信息
 *  @param success     上傳成功的回調
 *  @param failure     上傳失敗的回調
 */
- (void)uploadWithURLString:(NSString *)URLString
                 parameters:(id)parameters
                uploadParam:(NSArray <UploadParam *> *)uploadParams
                    success:(void (^)())success
                    failure:(void (^)(NSError *error))failure;

/**
 *  下載數據
 *
 *  @param URLString   下載數據的網址
 *  @param parameters  下載數據的參數
 *  @param success     下載成功的回調
 *  @param failure     下載失敗的回調
 */
- (void)downLoadWithURLString:(NSString *)URLString
                   parameters:(id)parameters
                     progerss:(void (^)())progress
                      success:(void (^)())success
                      failure:(void (^)(NSError *error))failure;

@end

 

  

@implementation HttpRequest

static id _instance = nil;
+ (instancetype)sharedInstance {
    return [[self alloc] init];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

- (instancetype)init {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super init];
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
        [manager startMonitoring];
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                {
                    // 位置網絡
                    NSLog(@"位置網絡");
                }
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                {
                    // 沒法聯網
                    NSLog(@"沒法聯網");
                }
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                {
                    // 手機自帶網絡
                    NSLog(@"當前使用的是2G/3G/4G網絡");
                }
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                {
                    // WIFI
                    NSLog(@"當前在WIFI網絡下");
                }
            }
        }];
    });
    return _instance;
}

#pragma mark -- GET請求 --
- (void)getWithURLString:(NSString *)URLString
              parameters:(id)parameters
                 success:(void (^)(id))success
                 failure:(void (^)(NSError *))failure {
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    /**
     *  能夠接受的類型
     */
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    /**
     *  請求隊列的最大併發數
     */
//    manager.operationQueue.maxConcurrentOperationCount = 5;
    /**
     *  請求超時的時間
     */
    manager.requestSerializer.timeoutInterval = 30;
    [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark -- POST請求 --
- (void)postWithURLString:(NSString *)URLString
               parameters:(id)parameters
                  success:(void (^)(id))success
                  failure:(void (^)(NSError *))failure {
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark -- POST/GET網絡請求 --
- (void)requestWithURLString:(NSString *)URLString
                  parameters:(id)parameters
                        type:(HttpRequestType)type
                     success:(void (^)(id))success
                     failure:(void (^)(NSError *))failure {
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    switch (type) {
        case HttpRequestTypeGet:
        {
            [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                if (success) {
                    success(responseObject);
                }
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                if (failure) {
                    failure(error);
                }
            }];
        }
            break;
        case HttpRequestTypePost:
        {
            [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                if (success) {
                    success(responseObject);
                }
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                if (failure) {
                    failure(error);
                }
            }];
        }
            break;
    }
}

- (void)uploadWithURLString:(NSString *)URLString parameters:(id)parameters uploadParam:(NSArray<UploadParam *> *)uploadParams success:(void (^)())success failure:(void (^)(NSError *))failure {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (UploadParam *uploadParam in uploadParams) {
            [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.filename mimeType:uploadParam.mimeType];
        }
    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

#pragma mark - 下載數據
- (void)downLoadWithURLString:(NSString *)URLString parameters:(id)parameters progerss:(void (^)())progress success:(void (^)())success failure:(void (^)(NSError *))failure {
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
    NSURLSessionDownloadTask *downLoadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        if (progress) {
            progress();
        }
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        return targetPath;
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        if (failure) {
            failure(error);
        }
    }];
    [downLoadTask resume];
}

@end

 

我把個人demo也傳到個人git上了,歡迎你們下載,下載地址爲:https://git.oschina.net/wuhongxing/HXNetWorking.git。我用的是cocospod導入三方庫的,若是下載了不能使用的,也能夠聯繫我!
相關文章
相關標籤/搜索