最近一直很忙也沒有什么時間寫博客了。放假了休息一下,就寫一篇博客來總結一下最近做項目中出現過的問題吧!!!
首先,在項目中我的起到了什么作用,無非就是把美工(UI設計師)給我們的圖顯示出來,然后再和服務器進行交互。
那個我們和服務器怎么交互呢?最簡單的方式就是說話唄,但是我們要跟服務器說話必須通過我們彼此能聽的懂的話來交流,也就需要制定很多的協議了(http,tcp,udp等,這個有興趣的朋友可以了解一下網絡協議的東西)。但是我平常最常使用的還是http協議。
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html這篇博客詳細講解了http協議的東西(我能說是我隨便百度了一篇博客嗎?)
然后github上的AFNetworking應該現在是應用的最廣泛的網絡請求三方庫了吧。那么今天就來說一下AFNetworing。
既然人家已經封裝的這么好了,我們為什么還要多此一舉再封裝呢?
那現在就來說一下再封裝的意義是什么?
最重要的意義差不多就是統一接口(這個也是封裝的一個作用,如果不了解封裝的同學可以去看看封裝的用處,是個提高效率的非常有效的辦法),這一點要是再多人項目中尤其能體現出來,我的一個同事用的是系統自帶的MKNetworking,很多人可能聽都沒聽過,他雖然用的很好,我也能看的懂,但是還是感覺看起來很難受,因為我根本不想看到他的具體用法和實現是什么樣子的(雖然真正敲起來可能也只是多了兩行代碼而已),只需要調一個接口就什么都用了不就好了,為什么還要敲那么多重復的代碼呢(Don't repeat yourself)?
好,下面我就來對AFNetworking再封裝:
首先,還是說一下封裝的事情,如果是你自己用,那么你可以隨便寫一寫,因為你不用注釋也能看的懂。但是如果是給幾個人用,你可以直接告訴他們,或者說是寫一個比較詳細的注釋,以便他們日后忘記了看一下就知道每個參數的意義是什么了!!!我將網絡請求封裝成了單例,詳細代碼見下:
那么我在網絡請求的時候究竟最常用的網絡請求有哪些呢?
我最常用到的就是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導入三方庫的,如果下載了不能使用的,也可以聯系我!