AFNetworking3.0升級(jí)記錄1

前言

公司最近剛剛趕完一個(gè)版本需求粟耻,準(zhǔn)備對(duì)AFNetworking進(jìn)行升級(jí)。其實(shí)年前就做過這方面研究眉踱,當(dāng)時(shí)是因?yàn)橛袀餮?017年后蘋果要求升級(jí)https而老的網(wǎng)絡(luò)底層不支持挤忙,必須升級(jí)。后來(lái)因?yàn)樾滦枨蟊容^趕勋锤,又在網(wǎng)上找到可靠消息說網(wǎng)上都是謠傳并沒有強(qiáng)制升級(jí)于是就擱置了下來(lái)饭玲。

簡(jiǎn)介

AFNetworking是對(duì)IOS本身網(wǎng)絡(luò)請(qǐng)求的封裝,有兩種方式NSURLConnection和NSURLSession叁执。

因?yàn)锳FNetworking1.0就是構(gòu)建于NSURLConnection之上的茄厘,等到AFNetworking2.0才NSURLSession的方式矮冬,之后的AFNEtworking3.0更去掉了NSURLConnection的方式。關(guān)于原因可以點(diǎn)擊這里次哈。

所以這一次我的主要任務(wù)就是從之前的NSURLConnection(AFHTTPRequestOperationManager)升級(jí)到NSURLSession(AFHTTPSessionManager)胎署。

當(dāng)前網(wǎng)絡(luò)層

剛開始我得先把當(dāng)前的網(wǎng)絡(luò)層理一下,看下哪些地方用到網(wǎng)絡(luò)請(qǐng)求窑滞。最后發(fā)現(xiàn)也復(fù)雜琼牧,一共兩種不一樣的地方:
1.最主要的一個(gè)就是對(duì)一般網(wǎng)絡(luò)POST請(qǐng)求的封裝。
2.上傳一些諸如圖片哀卫、音頻等文件的PUT請(qǐng)求巨坊。

看上去挺簡(jiǎn)單的,但因?yàn)榇a經(jīng)過多代人之手此改,難免有些冗余代碼質(zhì)量也不是特別高趾撵,就像上傳附件的封裝就有兩份在程序中都有用到,為了盡量不產(chǎn)生新問題我也就對(duì)它們都做修改共啃。

下面是之前的實(shí)現(xiàn)方式的主要流程占调,一些代碼上的坑我就不放出來(lái)了。

1.首先是一般網(wǎng)絡(luò)POST請(qǐng)求的封裝移剪。

(1)首先是單例的實(shí)現(xiàn)基礎(chǔ)設(shè)置:

+ (instancetype) sharedClient{
    
    static NetworkManager *_sharedClient = nil;
    static dispatch_once_t _onceTocken;
    dispatch_once(&_onceTocken, ^{
        
        if (appDelegate.apiBaseUrlStr) {
            _sharedClient = [[NetworkManager alloc] initWithBaseURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",appDelegate.apiBaseUrlStr]]];
        } else {
            _sharedClient = [[NetworkManager alloc] initWithBaseURL:[NSURL URLWithString:@"(null)"]];
        }
        _sharedClient.llOperationQueue = [[NSOperationQueue alloc] init];
        //最大并發(fā)數(shù)
        _sharedClient.llOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
        [_sharedClient.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        [_sharedClient.requestSerializer setValue:ApiVersion forHTTPHeaderField:@"User-Agent"];
        [_sharedClient.requestSerializer setTimeoutInterval:30];
        _sharedClient.bstart = NO;
        _sharedClient.apiCount = 0;
    });
    
    return _sharedClient;
}

(2)POST請(qǐng)求對(duì)外接口:

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                parameters:(id)parameters
                  progress:(void (^)(NSProgress * _Nonnull))uploadProgress
                success:(nullable void (^)(NSURLSessionDataTask * _Nonnull, id _Nonnull))success
                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
    if (![CommonClass checkNetworkRechable]) {
        failure(nil,[NSError errorWithDomain:@"www.mHealth.com" code:-1009 userInfo:nil]);
        return nil;
    }
    if((!appDelegate.apiBaseUrlStr || appDelegate.apiBaseUrlStr.length < 1) && !_bstart)
    {
#ifdef DEBUG_MODE
        NSLog(@"No baseurl, need network access");
#endif
        
        [self.llOperationQueue setSuspended:true];
        LandbalancerSessionOperation *llsessionOperation = [[LandbalancerSessionOperation alloc] initWithURLString:URLString parameters:parameters success:success failure:failure];
        [self.llOperationQueue addOperation:llsessionOperation];
        
        _bstart = true;
        [self requestApi];
        
        return nil;
    }
    else
    {
        return [super POST:URLString parameters:parameters progress:uploadProgress success:success failure:failure];
    }
}

這邊有個(gè)判斷究珊,如果沒有baseurl,則要把當(dāng)次請(qǐng)求先掛起纵苛,先去請(qǐng)求version接口剿涮,完成后再開始當(dāng)次請(qǐng)求。

2.附件上傳

我們這邊上傳附件的流程是這樣的赶站,先進(jìn)行POST請(qǐng)求將我們拼接好的文件名和文件大小給云端幔虏,云端這時(shí)候會(huì)返回我們需要上傳到的url,我們?cè)偻ㄟ^這個(gè)url進(jìn)行PUT上傳贝椿。
(1)POST請(qǐng)求將文件名和長(zhǎng)度給云端:

#pragma mark - NSOperation
-(void)main
{
    [self.lock lock];
    if(!self.file.rawData)
    {
        return;
    }
    NSUInteger size = self.file.rawData.length;
    if (size <= 0)
    {
        //        [self removeOperationFromDB];
        return;
    }
    if(!self.file.key || self.file.key.length < 1)
    {
        return;
    }
    
    NSMutableDictionary *parameterMDic = [[NSMutableDictionary alloc] init];
    [parameterMDic setObject:[NSNumber numberWithInteger:size] forKey:@"size"];
    [parameterMDic setObject:self.file.key forKey:@"filename"];
    [parameterMDic setObject:[appDelegate.userDefaults objectForKey:AccessToken] forKey:AccessToken];
    [[NetworkManager sharedClient] POST:API_ATTACHMENT parameters:parameterMDic success:^
     (AFHTTPRequestOperation *__unused task, id JSON){
         
#ifdef DEBUG_MODE
#endif
         [self completionBlock:API_ATTACHMENT withData:JSON withUserInfo:nil];
         
     }failure:^
     (AFHTTPRequestOperation *__unused task, NSError *error){
         
#ifdef DEBUG_MODE
#endif
         
         [self failedBlock:API_ATTACHMENT withError:error withUserInfo:nil];
     }];
    [self.lock unlock];
}

(2)這里把云端返回?cái)?shù)據(jù)統(tǒng)一判斷想括,未完成就進(jìn)行PUT請(qǐng)求上傳文件,直到完成:

-(void)dealAttachmentResponse:(NSDictionary *)responseDic
{
    [self.lock lock];
    NSString *finishStr = [responseDic objectForKey:@"finished"];
    if ([CommonClass bNull:(NSNull *)finishStr] && finishStr)
    {
        _finishStr = finishStr;
    }
    else
    {
        _finishStr = nil;
    }
    NSNumber *lenNum = [responseDic objectForKey:@"len"];
    NSString *methodStr = [responseDic objectForKey:@"method"];
    if ([CommonClass bNull:(NSNull *)methodStr] && methodStr)
    {
        _methodStr = methodStr;
    }
    else
    {
        _methodStr = nil;
    }
    NSNumber *offNum = [responseDic objectForKey:@"off"];
    NSString *urlStr = [responseDic objectForKey:@"url"];
    if ([CommonClass bNull:(NSNull *)urlStr] && urlStr)
    {
        _urlStr = urlStr;
    }
    else
    {
        _urlStr = nil;
    }
    //    _urlStr = [_urlStr stringByReplacingOccurrencesOfString:@"db.mcloudlife.com" withString:@"115.236.76.184"];
    
    if ([_finishStr isEqualToString:@"Y"] || [lenNum integerValue] <= 0)
    {
        //上傳完成
//        NSString *imgName = [urlStr lastPathComponent];
//        self.uploadOneFileSucceeded(imgName, self.fileIndex, self.file.key);
        self.uploadOneFileSucceeded(_urlStr, self.fileIndex, self.file.key);
        return;
    }
    
    NSRange range = NSMakeRange([offNum integerValue], [lenNum integerValue]);
    NSData * data = [self getUploadImgData:self.file.rawData withRange:range];
    NSInputStream *inputStream = [[NSInputStream alloc] initWithData:data];
    [self httpRequestThroughPut:inputStream];
    
    [self.lock unlock];
}

- (NSData *)getUploadImgData:(NSData *)imgData withRange:(NSRange)range
{
    NSUInteger length =  [imgData length];
    if (length < (range.location + range.length)) {
        return nil;
    }
    NSData *subData = [imgData subdataWithRange:range];
    return subData;
}

(3)PUT請(qǐng)求上傳數(shù)據(jù)烙博,失敗重試瑟蜈,成功則再以上面的方法判斷是否完成。

#pragma mark - NetWork_Upload
-(void)httpRequestThroughPut:(NSInputStream *)inputStream
{
    if (inputStream && _urlStr)
    {
        AFHTTPRequestOperationManager *requestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:nil];
        //設(shè)置httpHeader
        [requestOperationManager.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
        [requestOperationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [requestOperationManager.requestSerializer setValue:[NSString stringWithFormat:@"mCloud %@",[appDelegate.userDefaults objectForKey:AccessToken]] forHTTPHeaderField:@"Authorization"];
        [requestOperationManager.requestSerializer setValue:@"db.mcloudlife.com" forHTTPHeaderField:@"Host"];
        //設(shè)置超時(shí)時(shí)間
        [requestOperationManager.requestSerializer setTimeoutInterval:-1];
        
        //put請(qǐng)求
        AFHTTPRequestOperation *requestOperation = [requestOperationManager PUT:_urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (![NetworkErrorDeal getErrorMsgWithResponseData:responseObject])
            {
                if(![responseObject isKindOfClass:[NSDictionary class]])
                {
                    return;
                }
                [self dealResponse:responseObject];
            }
            else
            {
                //嘗試重新請(qǐng)求
                if(_retryCount <= 0)
                {
                    return ;
                }
                _retryCount--;
                dispatch_queue_t  queue= dispatch_queue_create("dealFileAttachmentResponse", NULL);
                dispatch_async(queue, ^{
                    [self httpRequestThroughPut:inputStream];
                });
            }
            
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            
            if(_retryCount <= 0)
            {
                return ;
            }
            _retryCount--;
            dispatch_queue_t  queue= dispatch_queue_create("dealImageAttachmentResponse", NULL);
            dispatch_async(queue, ^{
                [self httpRequestThroughPut:inputStream];
            });
        }];
        
        __block AFHTTPRequestOperation *progressOperation = requestOperation;
        
        [requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
            
//        }]
        
//        [requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
            
            double percent = totalBytesWritten * 1.0 / self.file.fileSize;
            
            if (self.uploadOneFileProgress) {
                self.uploadOneFileProgress(progressOperation, self.fileIndex, percent);
            }
        }];
        
        //設(shè)置httpbodystream
        [requestOperation setInputStream:inputStream];
    }
}

好了渣窜,這些就是之前的網(wǎng)絡(luò)層铺根,等我給測(cè)試進(jìn)行整體測(cè)試如果沒問題的話,我會(huì)在下一篇記錄主要的修改乔宿。
另外大家如果有關(guān)于升級(jí)AFNetworking3.0的問題的話可以留下評(píng)論位迂,指教不敢當(dāng),互相討論吧:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末济蝉,一起剝皮案震驚了整個(gè)濱河市纱意,隨后出現(xiàn)的幾起案子肃叶,更是在濱河造成了極大的恐慌呼股,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件党晋,死亡現(xiàn)場(chǎng)離奇詭異统翩,居然都是意外死亡娇豫,警方通過查閱死者的電腦和手機(jī)锣杂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門脂倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人元莫,你說我怎么就攤上這事赖阻。” “怎么了柒竞?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵政供,是天一觀的道長(zhǎng)播聪。 經(jīng)常有香客問我朽基,道長(zhǎng),這世上最難降的妖魔是什么离陶? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任稼虎,我火速辦了婚禮,結(jié)果婚禮上招刨,老公的妹妹穿的比我還像新娘霎俩。我一直安慰自己,他們只是感情好沉眶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布打却。 她就那樣靜靜地躺著,像睡著了一般谎倔。 火紅的嫁衣襯著肌膚如雪柳击。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天片习,我揣著相機(jī)與錄音捌肴,去河邊找鬼。 笑死藕咏,一個(gè)胖子當(dāng)著我的面吹牛状知,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孽查,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饥悴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起西设,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤起宽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后济榨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯沪,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年擒滑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腐晾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丐一,死狀恐怖藻糖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情库车,我是刑警寧澤巨柒,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站柠衍,受9級(jí)特大地震影響洋满,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珍坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一牺勾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阵漏,春花似錦驻民、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叹洲,卻和暖如春柠硕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疹味。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仅叫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糙捺。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓诫咱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洪灯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坎缭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā)竟痰,例如說新浪微博、微信等掏呼,這些應(yīng)用本身可...
    lichengjin閱讀 3,658評(píng)論 2 7
  • 目錄 網(wǎng)絡(luò)基本概念 TCP/IP協(xié)議簇基本概念 HTTP 網(wǎng)絡(luò)開發(fā)技術(shù)解決方案 數(shù)據(jù)解析 網(wǎng)絡(luò)優(yōu)化 1. 網(wǎng)絡(luò)基本...
    Ryan___閱讀 1,357評(píng)論 1 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)坏快、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評(píng)論 4 62
  • 在蘋果徹底棄用NSURLConnection之后自己總結(jié)的一個(gè)網(wǎng)上的內(nèi)容憎夷,加上自己寫的小Demo莽鸿,很多都是借鑒網(wǎng)絡(luò)...
    付寒宇閱讀 4,278評(píng)論 2 13
  • 北京西山,上班路上隨拍拾给,那天天空格外美麗祥得。 晚霞,小區(qū)隨拍蒋得,生活并不缺少美级及。 朝霞,娘家隨拍额衙,冬季也格外動(dòng)人饮焦。 披...
    黃泗娘家花滿溪閱讀 243評(píng)論 4 5