iOS菜鳥之AFN的二次封裝


我用一個單例類將一些常用的網絡請求進行了二次封裝,主要包括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; //創建請求管理(用於上傳和下載)
}
@end
static 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

有很多不足之處請大家多多指正,可以評論或點關注進行技術交流。后續也會寫一些自己平時學習的點點滴滴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM