AFNetworking封裝

一.思路

整個項目的所有api請求看成一個tableView,那么每一個api請求就相當(dāng)于一個cell。每一次api請求,就是把parametersurl賦值給cell,然后調(diào)用afn的api裕循。

  • 在調(diào)用afn的api之前,先監(jiān)聽一下當(dāng)前網(wǎng)絡(luò)狀態(tài)净刮,做相應(yīng)的邏輯處理剥哑。
  • 退出某個頁面之前,api請求還沒有結(jié)果返回淹父,取消該請求株婴。

二.第一層封裝(簡單的調(diào)用afn)

- (NSURLSessionDataTask *)requestWithConfigure:(HttpRequestConfigure *)configure
                                       Success:(ResponseSuccess)success
                                       Failure:(ResponseFailed)failure
                                      Finished:(ResponseFinished)finished{
    AFHTTPSessionManager *sessionManger = [AFHTTPSessionManager sharedManager];
    // -- 網(wǎng)絡(luò)超時時間設(shè)置 --
    [sessionManger.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    sessionManger.requestSerializer.timeoutInterval = configure.timeoutInterval;
    [sessionManger.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    switch (configure.requestType) {
        case RequestTypeGET:{
            return [sessionManger GET:configure.requestUrl
                           parameters:configure.parameters
                             progress:nil
                              success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                                  success(task,responseObject);
                                  finished(task,responseObject,nil);
                              }
                              failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                        failure(task,error);
                        finished(task,nil,error);
                   }];
            break;
        }
        case RequestTypePOST:{
            return [sessionManger POST:configure.requestUrl
                            parameters:configure.parameters
                              progress:nil
                               success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                                   success(task,responseObject);
                                   finished(task,responseObject,nil);
                               }
                               failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                       failure(task,error);
                       finished(task,nil,error);
                   }];
            break;
        }
        // --如果還需要其他類型的請求,可以在這里繼續(xù)添加--
    }
}

如果afn更新暑认,相應(yīng)api變動困介,只需要在這里修改。

三.第二層封裝

- (NSURLSessionDataTask *)sendRequest:(ResponseConfigure)configureBlock
                              Success:(SuccessCallBackData)success
                              Failure:(FailedCallBackReason)failure
                             Finished:(FinishedCallBack)finished{
    HttpRequestConfigure *configure = [HttpRequestConfigure setConfigure];
    if (configureBlock) {
        configureBlock(configure);
    }
    HttpRequestConfigure *requestConfigure = [self resetRequestConfiguration:configure];
    if ([[HttpNetwork sharedNetwork] isReachable]) {
        return [[HttpRequestBasics defaultCenter] requestWithConfigure:requestConfigure Success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSDictionary *data = [self analyzeResponseData:responseObject];
            if (success) {
                success(data);
            }
        } Failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSString *reason = [self returnErrorDescription:error];
            if (failure) {
                failure(reason);
            }
        } Finished:^(NSURLSessionDataTask * _Nullable task, id  _Nullable responseObject, NSError * _Nullable error) {
            NSDictionary *data = [self analyzeResponseData:responseObject];
            NSString *reason = [self returnErrorDescription:error];
            if (finished) {
                finished(data, reason);
            }
        }];
    }
    else{
        failure(kNotHttpNetExpression);
        return nil;
    }
}
  • 將外部傳進(jìn)來的parametersurl賦值給請求配置cell (即HttpRequestConfigure對象)蘸际,把cell傳遞到第一層座哩。
  • 在調(diào)用第一層方法之前,判斷網(wǎng)絡(luò)可用性(使用Reachability):
    [[HttpNetwork sharedNetwork] isReachable]

四. 外部調(diào)用

    // 沒有回調(diào)
    [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    }];
    // 成功回調(diào)
    [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    } Success:^(NSDictionary *dict) {
        NSLog(@"dict:%@",dict);
    }];
    // 失敗回調(diào)
    [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    } Failure:^(NSString *reason) {
        NSLog(@"reason:%@",reason);
    }];
    // 結(jié)束回調(diào)
    [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    } Finished:^(NSDictionary * _Nullable dict, NSString *reason) {
        NSLog(@"--");
    }];
    // 成功和失敗回調(diào)
    [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    } Success:^(NSDictionary *dict) {
        NSLog(@"dict:%@",dict);
    } Failure:^(NSString *reason) {
        NSLog(@"reason:%@",reason);
    }];
    // 成功粮彤,失敗和結(jié)束回調(diào)
    NSURLSessionDataTask *task = [HttpRequestTool sendRequest:^(HttpRequestConfigure *configure) {
        configure.requestType = RequestTypePOST;
        configure.specialUrl = kHomePage_Ad_URL;
    } Success:^(NSDictionary *dict) {
        NSLog(@"dict:%@",dict);
    } Failure:^(NSString *reason) {
        NSLog(@"reason:%@",reason);
    } Finished:^(NSDictionary * _Nullable dict, NSString *reason) {
        NSLog(@"--");
    }];
    // 在需要取消請求的地方取消請求
    [task cancel];

[task cancel];取消該線程根穷,一般會在控制器銷毀(dealloc)的時候調(diào)用。

五. Demo

HttpRequestTool

六.討論

該請求工具我親試导坟,沒有發(fā)現(xiàn)什么問題屿良,而且也非常方便。如果遇到問題或者有什么建議惫周,歡迎評論探討管引。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闯两,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谅将,老刑警劉巖漾狼,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饥臂,居然都是意外死亡逊躁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門隅熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稽煤,“玉大人核芽,你說我怎么就攤上這事〗臀酰” “怎么了轧简?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匾二。 經(jīng)常有香客問我哮独,道長,這世上最難降的妖魔是什么察藐? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任皮璧,我火速辦了婚禮,結(jié)果婚禮上分飞,老公的妹妹穿的比我還像新娘悴务。我一直安慰自己,他們只是感情好譬猫,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布讯檐。 她就那樣靜靜地躺著,像睡著了一般删窒。 火紅的嫁衣襯著肌膚如雪裂垦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天肌索,我揣著相機(jī)與錄音蕉拢,去河邊找鬼。 笑死诚亚,一個胖子當(dāng)著我的面吹牛晕换,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播站宗,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闸准,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梢灭?” 一聲冷哼從身側(cè)響起夷家,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敏释,沒想到半個月后库快,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钥顽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年义屏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡闽铐,死狀恐怖蝶怔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兄墅,我是刑警寧澤踢星,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站察迟,受9級特大地震影響斩狱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扎瓶,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一所踊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧概荷,春花似錦秕岛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愈捅,卻和暖如春遏考,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓝谨。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工灌具, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人譬巫。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓咖楣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芦昔。 傳聞我的和親對象是個殘疾皇子诱贿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355