iOS資料請求超時處理

weixin_34290000發表於2017-08-14

前言

在網路情況不好時,afnet庫請求的預設超時時間過長,為了提高使用者體驗,我們可以自己設定請求超時時間,並在超時後取消當前請求佇列。

實現思路

1.在自己封裝的資料請求單利類中設定合適的請求超時時間;

 [qlmanager.SessionManager.requestSerializer setTimeoutInterval:10];

2.請求超時後,會呼叫請求失敗的回撥,在回撥方法中判斷錯誤碼為-1001 時 進行超時提示以及取消當前請求任務

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:@"伺服器程式異常"];
            handle(data,nil,1);
        }else if ([data[@"status"] isEqualToString:@"400"])
        {
            [ql_hud_manager showInfoWithStatus:@"請求引數結構錯誤"];
            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:@"資料庫資料異常"];
            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:@"無法連線伺服器"];
            NSLog(@"%s 第%d行 %@",__func__,__LINE__,error.description);

        }
    }];
}
@end

相關文章