iOS菜鳥之AFN的二次封裝,iosafn二次封裝
我用一個單例類將一些常用的網路請求進行了二次封裝,主要包括post請求 get請求 圖片檔案上傳下載 視頻的斷點續傳等功能。
首先大家先去github上下載AFN,將檔案夾內的AFNetworking檔案夾拖入工程中,然後建立一個圖片檔案參數類代碼如下:
#import <Foundation/Foundation.h>@interface UploadParam : NSObject/** * 上傳檔案的位元據 */@property (nonatomic, strong) NSData *data;/** * 上傳的參數名稱 */@property (nonatomic, copy) NSString *name;/** * 上傳到伺服器的檔案名稱 */@property (nonatomic, copy) NSString *fileName;/** * 上傳檔案的類型 */@property (nonatomic, copy) NSString *mimeType;@end
#import "UploadParam.h"@implementation UploadParam@end
然後建立網路工具AFNManager具體代碼如下(此處我提供了代理和block兩種方式進行傳值供大家選擇):
#import <Foundation/Foundation.h>#import "AFNManagerDelegate.h"#import "UploadParam.h"@interface AFNManager : NSObject@property (nonatomic, weak) id<AFNManagerDelegate> delegate;/** * AFNManager單利 */+(AFNManager *)sharedManager;#pragma mark --代理的方式傳值/** * get */- (void)GET:(NSString *)URLString parameters:(id)parameters;/** * post */- (void)Post:(NSString *)URLString parameters:(id)parameters;/** * upload */- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam;#pragma mark --block的形式傳值/** * get請求 */- (void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;/** * post請求 */- (void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;/** * upload */- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id data))succeed failure:(void (^)(NSError *error))failure;#pragma mark --斷點續傳/** * 開始下載 斷點續傳 * * @param URLString 請求介面 */- (void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName;/** * 開始上傳 斷點續傳 * * @param URLString 請求介面 */- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData;/** * 暫停操作 斷點續傳 */- (void)operationPause;/** * 繼續操作 斷點續傳 */- (void)operationResume;/** * 取消操作 */- (void)operationCancel;@end
#import "AFNManager.h"#import "AFNetworking.h"@interface AFNManager(){ AFHTTPRequestOperation *operation; //建立要求管理(用於上傳和下載)}@endstatic AFNManager *manager = nil;@implementation AFNManager+(AFNManager *)sharedManager{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (manager == nil) { manager = [[self alloc] init]; } }); return manager;}+(instancetype)allocWithZone:(struct _NSZone *)zone{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (manager == nil) { manager = [super allocWithZone:zone]; } }); return manager;}- (void)GET:(NSString *)URLString parameters:(id)parameters{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { [self.delegate AFNManagerDidSuccess:responseObject]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { [self.delegate AFNManagerDidFaild:error]; } }];}- (void)Post:(NSString *)URLString parameters:(id)parameters{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { [self.delegate AFNManagerDidSuccess:responseObject]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { [self.delegate AFNManagerDidFaild:error]; } }];}- (void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上傳的檔案全部拼接到formData /** * FileData:要上傳的檔案的位元據 * name:上傳參數名稱 * fileName:上傳到伺服器的檔案名稱 * mimeType:檔案類型 */ [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { [self.delegate AFNManagerDidSuccess:responseObject]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { [self.delegate AFNManagerDidFaild:error]; } }]; }-(void)GET:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if (responseObject == nil) { return ; } succeed(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }];}-(void)Post:(NSString *)URLString parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr POST:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if (responseObject == nil) { return ; } succeed(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { failure(error); }]; }-(void)Upload:(NSString *)URLString parameters:(id)parameters uploadParam:(UploadParam *)uploadParam succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure{ // 建立要求管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; [mgr POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 上傳的檔案全部拼接到formData /** * FileData:要上傳的檔案的位元據 * name:上傳參數名稱 * fileName:上傳到伺服器的檔案名稱 * mimeType:檔案類型 */ [formData appendPartWithFileData:uploadParam.data name:uploadParam.name fileName:uploadParam.fileName mimeType:uploadParam.mimeType]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { succeed(responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (self.delegate && [self.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { failure(error); } }];}-(void)downloadStartWithUrl:(NSString *)URLString fileName:(NSString *)fileName{ NSString *filePath = [NSString stringWithFormat:@"%@/Documents/%@",NSHomeDirectory(), fileName]; operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];// 可以在此設定進度條 // [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {// // }]; __weak typeof(self) weakself = self; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { // 請求成功做出提示 if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { [weakself.delegate AFNManagerDidSuccess:responseObject]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 請求失敗做出提示 if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { [weakself.delegate AFNManagerDidFaild:error]; } }]; [operation start];}- (void)uploadStartWithUrl:(NSString *)URLString fileData:(NSData *)fileData{ operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; operation.inputStream = [[NSInputStream alloc] initWithData:fileData]; // 設定進度條// [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {// // }]; __weak typeof(self) weakself = self; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { // 請求成功做出提示 if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidSuccess:)]) { [weakself.delegate AFNManagerDidSuccess:responseObject]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 請求失敗做出提示 if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(AFNManagerDidFaild:)]) { [weakself.delegate AFNManagerDidFaild:error]; } }]; [operation start];}- (void)operationPause{ [operation pause];}- (void)operationResume{ [operation resume];}- (void)operationCancel{ [operation cancel];}//網路監聽(用於檢測網路是否可以連結。此方法最好放於AppDelegate中,可以使程式開啟便開始檢測網路)- (void)reachabilityManager{ AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; //開啟網路監聽 [mgr.reachabilityManager startMonitoring]; //監聽網路變化 [mgr.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { //當網路不可用(無網路或請求延時) case AFNetworkReachabilityStatusNotReachable: break; //當為手機WiFi時 case AFNetworkReachabilityStatusReachableViaWiFi: break; //當為手機蜂窩資料網 case AFNetworkReachabilityStatusReachableViaWWAN: break; //其它情況 default: break; } }]; // //停止網路監聽(若需要一直檢測網路狀態,可以不停止,使其一直運行)// [mgr.reachabilityManager stopMonitoring];}@end
網路工具代理協議代碼如下:
#import <Foundation/Foundation.h>@class AFNManager;@protocol AFNManagerDelegate <NSObject>@optional/** * 發送請求成功 * * @param manager AFNManager */-(void)AFNManagerDidSuccess:(id)data;/** * 發送請求失敗 * * @param manager AFNManager */-(void)AFNManagerDidFaild:(NSError *)error;@end
有很多不足之處請大家多多指正,可以評論或點關注進行技術交流。後續也會寫一些自己平時學習的點點滴滴。