import <Foundation/Foundation.h>
#import "AFNetworking.h"
typedef void(^RequestSuccessCallback)(id responseObject);// 成功时候回调
typedef void(^RequestFailedCallback)(NSError *error); // 失败时候回调
typedef void(^AllRequestCallback)(); // 所有请求回调
@interface YSHTTPHelper : NSObject
/*** 创建一个单例类 */
+ (YSHTTPHelper *)defaultHTTPHelper;
/** 请求管理者 */
@property (nonatomic, strong) AFHTTPRequestOperationManager *manager;
/**
* POST请求
*
* @param URLString 网络接口
* @param parameters 参数
* @param success 成功调用
* @param failure 失败时候调用
*/
- (AFHTTPRequestOperation *)POST:(NSString *)URLString
parameters:(NSMutableDictionary *)parameters
SuccessCallback:(RequestSuccessCallback)successCallback
FailureCallback:(RequestFailedCallback)failureCallback
AllRequestCallback:(AllRequestCallback)allRequestCallback;
/**
* GET请求
*
* @param URLString 网络接口
* @param parameters 参数
* @param success 成功调用
* @param failure 失败时候调用
*/
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(NSMutableDictionary *)parameters
SuccessCallback:(RequestSuccessCallback)successCallback
FailureCallback:(RequestFailedCallback)failureCallback
AllRequestCallback:(AllRequestCallback)allRequestCallback;
#import "YSHTTPHelper.h"
@implementation YSHTTPHelper
- (instancetype)init
{
self = [super init];
if (self)
{
_manager = [[AFHTTPRequestOperationManager alloc] init];
_manager.requestSerializer = [AFHTTPRequestSerializer serializer];
_manager.requestSerializer.timeoutInterval = 10.f;// 请求时长为10秒
_manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];// 请求方式为JSON
}
return self;
}
/**
* 单例的个人理解:如果这个实例等于空的时候再去创建
* 官方:保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源
* 优点:节约内存空间
*/
+ (YSHTTPHelper *)defaultHTTPHelper
{
static YSHTTPHelper *instances = nil;// 创建实例对象
/**
* 下面我们来看看dispatch_once的原理:
* dispatch_once主要是根据onceToken的值来决定怎么去执行代码。
* 当onceToken= 0时,线程执行dispatch_once的block中代码
* 当onceToken为其他值时,线程被线程被阻塞,等待onceToken值改变
* 当线程首先调用shareInstance,某一线程要执行block中的代码时,首先需要改变onceToken的值,再去执行block中的代码。这里onceToken的值变为了140734731430192。
* 这样当其他线程再获取onceToken的值时,值已经变为140734731430192。其他线程被阻塞。
* 这样dispatch_once在首次调用时同步阻塞线程,生成单例之后,不再阻塞线程。dispatch_once是创建单例的最优方案
*
*/
static dispatch_once_t onceToken;// 创建线程锁
dispatch_once(&onceToken, ^{
instances = [[self alloc] init];// 当没有的时候去创建
});
return instances;
}
/**
* POST请求
*
* @param URLString 网络接口
* @param parameters 参数
* @param success 成功调用
* @param failure 失败时候调用
*/
- (AFHTTPRequestOperation *)POST:(NSString *)URLString
parameters:(NSMutableDictionary *)parameters
SuccessCallback:(RequestSuccessCallback)successCallback
FailureCallback:(RequestFailedCallback)failureCallback
AllRequestCallback:(AllRequestCallback)allRequestCallback
{
AFHTTPRequestOperation *operation = [self.manager POST:URLString parameters:parameters success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
if (successCallback)
{
successCallback(responseObject);
}
if (allRequestCallback)
{
allRequestCallback();
}
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
if (failureCallback)
{
failureCallback(error);
}
if (allRequestCallback)
{
allRequestCallback();
}
}];
return operation;
}
/**
* GET请求
*
* @param URLString 网络接口
* @param parameters 参数
* @param success 成功调用
* @param failure 失败时候调用
*/
- (AFHTTPRequestOperation *)GET:(NSString *)URLString
parameters:(NSMutableDictionary *)parameters
SuccessCallback:(RequestSuccessCallback)successCallback
FailureCallback:(RequestFailedCallback)failureCallback
AllRequestCallback:(AllRequestCallback)allRequestCallback
{
AFHTTPRequestOperation *operation = [self.manager GET:URLString parameters:parameters success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
这里可以做你后台返回来请求成功中失败的问题,
if (successCallback)// 成功时候回调的Block {
successCallback(responseObject);
}
if (allRequestCallback) // 请求成功或失败的回调
{
allRequestCallback();
}
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
if (failureCallback)
{
failureCallback(error);
}
if (allRequestCallback)
{
allRequestCallback();
}
}];
return operation;
}