iOS---對AFNetworking進行二次封裝,使用單例單獨處理網絡請求數據

//在DataManager.h裏

#import <Foundation/Foundation.h>
@class DataManager;

//block回調傳值
/**
 *   請求成功回調json數據
 *
 *  @param json json串
 */
typedef void(^Success)(id json);
/**
 *  請求失敗回調錯誤信息
 *
 *  @param error error錯誤信息
 */
typedef void(^Failure)(NSError *error);

@interface DataManager : NSObject

//單例模式
+ (DataManager *)manager;

/**
 *  GET請求
 *
 *  @param url       NSString 請求url
 *  @param paramters NSDictionary 參數
 *  @param success   void(^Success)(id json)回調
 *  @param failure   void(^Failure)(NSError *error)回調
 */
- (void)getDataWithUrl:(NSString *)url parameters:(NSDictionary *)paramters success:(Success)success failure:(Failure)failure;

/**
 *  POST請求
 *
 *  @param url       NSString 請求url
 *  @param paramters NSDictionary 參數
 *  @param success   void(^Success)(id json)回調
 *  @param failure   void(^Failure)(NSError *error)回調
 */
- (void)postDataWithUrl:(NSString *)url parameters:(NSDictionary *)paramters success:(Success)success failure:(Failure)failure;

@end
//在DataManager.m裏
#import "DataManager.h"
#import <AFNetworking.h>
#import <JSONKit.h>
#import <UIKit+AFNetworking.h>

static DataManager *manager = nil;
static AFHTTPSessionManager *afnManager = nil;

@implementation DataManager

/**
 *  建立單例
 *
 *  @return <#return value description#>
 */
+ (DataManager *)manager {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[DataManager alloc] init];
        afnManager = [AFHTTPSessionManager manager];
        afnManager.responseSerializer = [AFHTTPResponseSerializer serializer];
    });
    
    return manager;
}

/**
 *  處理字符串將其轉成標準json格式
 *
 *  @param data 響應數據
 *
 *  @return id
 */
+ (id)handleResponseObject:(NSData *)data {
    
    //將獲取的二進制數據轉成字符串
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //去掉字符串裏的轉義字符
    NSString *str1 = [str stringByReplacingOccurrencesOfString:@"\\" withString:@""];
    //去掉頭和尾的引號「」
    NSString *str2 = [str1 substringWithRange:NSMakeRange(1, str1.length-2)];
    //最終str2爲json格式的字符串,將其轉成須要的字典和數組
    id object = [str2 objectFromJSONString];
    
    return object;
}

/**
 *  提示信息
 *
 *  @param message 要提示的內容
 */
+ (void)showAlertViewWithMessage:(NSString *)message {
    
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alertView show];
}
//GET請求
- (void)getDataWithUrl:(NSString *)url parameters:(NSDictionary *)paramters success:(Success)success failure:(Failure)failure {
    
    afnManager.responseSerializer = [AFJSONResponseSerializer serializer];
    [afnManager GET:url parameters:paramters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (responseObject) {
            success(responseObject);
        }else {
            [[self class] showAlertViewWithMessage:@"暫無數據"];
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (error) {
            [[self class] showAlertViewWithMessage:@"服務器出錯了~~~~(>_<)~~~~"];
            failure(error);
        }
    }];
    
}

//POST請求
- (void)postDataWithUrl:(NSString *)url parameters:(NSDictionary *)paramters success:(Success)success failure:(Failure)failure {
    
    [afnManager POST:url parameters:paramters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (responseObject) {
            success([[self class] handleResponseObject:responseObject]);
        }else {
            [[self class] showAlertViewWithMessage:@"暫無數據"];
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (error) {
            [[self class] showAlertViewWithMessage:@"服務器出錯了~~~~(>_<)~~~~"];
            failure(error);
        }
    }];
}
@end
相關文章
相關標籤/搜索