前言
在網(wǎng)絡(luò)情況不好時健蕊,afnet庫請求的默認(rèn)超時時間過長,為了提高用戶體驗踢俄,我們可以自己設(shè)置請求超時時間缩功,并在超時后取消當(dāng)前請求隊列。
實現(xiàn)思路
1.在自己封裝的數(shù)據(jù)請求單利類中設(shè)置合適的請求超時時間都办;
[qlmanager.SessionManager.requestSerializer setTimeoutInterval:10];
2.請求超時后嫡锌,會調(diào)用請求失敗的回調(diào),在回調(diào)方法中判斷錯誤碼為-1001 時 進行超時提示以及取消當(dāng)前請求任務(wù)
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
{
if (error.code == -1001)
{
[ql_hud_manager showInfoWithStatus:@"連接超時"];
[ql_hud_manager dismissWithDelay:2];
[task cancel];
handle(nil,error,0);
}
具體代碼
#import "ql_http_manager.h"
#import "AFHTTPSessionManager.h"
@interface ql_http_manager()
@property(nonatomic,strong) AFHTTPSessionManager * SessionManager;
@end
@implementation ql_http_manager
static ql_http_manager * qlmanager = nil;
+ (instancetype)share_ql_http_manager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!qlmanager)
{
qlmanager = [[ql_http_manager alloc]init];
}
});
return qlmanager;
}
- (instancetype)init
{
if ((qlmanager = [super init]))
{
qlmanager.SessionManager = [AFHTTPSessionManager manager];
qlmanager.SessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
qlmanager.SessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[qlmanager.SessionManager.requestSerializer setTimeoutInterval:10];
}
return qlmanager;
}
+ (void)post_with_Url:(NSString *)url and_param:(NSDictionary *)param and_log:(NSString*)log and_handle:(SucBlock)handle
{
[self share_ql_http_manager];
[ql_hud_manager showWithStatus:log];
[qlmanager.SessionManager POST:url parameters:param progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
{
NSDictionary * data = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
if ([data[@"status"] isEqualToString:@"200"])
{
[ql_hud_manager dismiss];
handle(data,nil,0);
}else if ([data[@"status"] isEqualToString:@"500"])
{
[ql_hud_manager showInfoWithStatus:@"服務(wù)器程序異常"];
handle(data,nil,1);
}else if ([data[@"status"] isEqualToString:@"400"])
{
[ql_hud_manager showInfoWithStatus:@"請求參數(shù)結(jié)構(gòu)錯誤"];
handle(data,nil,1);
}else if ([data[@"status"] isEqualToString:@"404"])
{
[ql_hud_manager showInfoWithStatus:@"用戶不存在"];
handle(data,nil,1);
}else if ([data[@"status"] isEqualToString:@"405"])
{
[ql_hud_manager showInfoWithStatus:@"密碼錯誤"];
handle(data,nil,1);
}else if ([data[@"status"] isEqualToString:@"406"])
{
[ql_hud_manager showInfoWithStatus:@"接口非法訪問"];
handle(data,nil,1);
}else if ([data[@"status"] isEqualToString:@"407"])
{
[ql_hud_manager showInfoWithStatus:@"數(shù)據(jù)庫數(shù)據(jù)異常"];
handle(data,nil,1);
}
NSLog(@"%@ %s 第%d行 %@",log,__func__,__LINE__,data[@"message"]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
{
if (error.code == -1001)
{
[ql_hud_manager showInfoWithStatus:@"連接超時"];
[ql_hud_manager dismissWithDelay:2];
[task cancel];
handle(nil,error,0);
}
else
{
handle(nil,error,0);
[ql_hud_manager showInfoWithStatus:@"無法連接服務(wù)器"];
NSLog(@"%s 第%d行 %@",__func__,__LINE__,error.description);
}
}];
}
@end