基于AFNetworking 3.0的集約性網(wǎng)絡請求API再封裝 支持多圖壓縮上傳,視頻,音頻上傳,文件下載等功能

i fought,but i lost,then i rest

MyZone


關(guān)于AFNetworking 3.0

NSURLConnection的API已廢棄


AFNetworking 1.0 是建立在 NSURLConnection基礎上的偿荷,AFNetworking 2.0 開始使用基于 NSURLConnection API基礎功能枝誊,同時也有基于新的NSURLSession API 的功能實現(xiàn)况芒。AFNetworking 3.0現(xiàn)在是專門建立在 NSURLSession 頂層的,這降低了維護負擔叶撒,同時允許支持蘋果為 NSURLSession 提供的任何額外的增強的特性绝骚。在Xcode 7NSURLConnection API 已經(jīng)被蘋果官方棄用祠够。然而API函數(shù)將繼續(xù)使用不會受影響压汪,只不過再也不會添加新的功能了,蘋果建議所有基于網(wǎng)絡的功能在未來都能使用 NSURLSession古瓤。


3.0 被移除的類有

? AFURLConnectionOperation
? AFHTTPRequestOperation
? AFHTTPRequestOperationManager


轉(zhuǎn)而替代的是

? AFURLSessionManager
? AFHTTPSessionManager

下面的方法也是基于NSURLSession進行封裝的
所有的請求方法都在NetWorkManager.m進行統(tǒng)一設置止剖,并且全部為類方法(調(diào)用方便)


tips

1.設置網(wǎng)路請求的BaseURL,請移步Supporting Files-->const.h中進行修改

    #define BaseURL @"http://apis.baidu.com/apistore"

   //請正確設置baseUrl的格式 否則會報無效的url(可參考demo中的設置)

2.關(guān)于tokken的設置


 #warning 此處做為測試 可根據(jù)自己應用設置相應的值 
 /**設置apikey ------類似于自己應用中的tokken---此處僅僅作為測試使用*/
 [self.requestSerializer setValue:apikey forHTTPHeaderField:@"apikey"];


主要實現(xiàn)的功能

1.文件下載
2.多圖壓縮上傳
3.視頻上傳(文件上傳,音頻上傳類似)
4.取消所有的網(wǎng)絡請求
5.取消指定的網(wǎng)絡請求
暫未考慮緩存請求到的數(shù)據(jù)


基本的post,get請求

/**
 *  網(wǎng)絡請求的實例方法
 *
 *  @param type         get / post
 *  @param urlString    請求的地址
 *  @param paraments    請求的參數(shù)
 *  @param successBlock 請求成功的回調(diào)
 *  @param failureBlock 請求失敗的回調(diào)
 *  @param progress 進度
 */
+(void)requestWithType:(HttpRequestType)type withUrlString:(NSString *)urlString withParaments:(id)paraments withSuccessBlock:( requestSuccess)successBlock withFailureBlock:( requestFailure)failureBlock progress:(downloadProgress)progress;
   

基本的post,get請求實現(xiàn)

/**
 *  網(wǎng)絡請求的實例方法
 *
 *  @param type         get / post
 *  @param urlString    請求的地址
 *  @param paraments    請求的參數(shù)
 *  @param successBlock 請求成功的回調(diào)
 *  @param failureBlock 請求失敗的回調(diào)
 *  @param progress 進度
 */

+(void)requestWithType:(HttpRequestType)type withUrlString:(NSString *)urlString withParaments:(id)paraments withSuccessBlock:(requestSuccess)successBlock withFailureBlock:(requestFailure)failureBlock progress:(downloadProgress)progress
{
    
    
    switch (type) {
            
        case HttpRequestTypeGet:
        {
            
            
            [[NetWorkManager shareManager] GET:urlString parameters:paraments progress:^(NSProgress * _Nonnull downloadProgress) {
                
                progress(downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
                
            } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                
                      successBlock(responseObject);
                
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                
                       failureBlock(error);
            }];
            
            break;
        }
            
        case HttpRequestTypePost:
            
        {
            
            [[NetWorkManager shareManager] POST:urlString parameters:paraments progress:^(NSProgress * _Nonnull uploadProgress) {
                
                progress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);

                
            } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                
                    successBlock(responseObject);
                
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                
                     failureBlock(error);
                
            }];
        }
            
    }
    
}

上傳圖片

/**
 *  上傳圖片
 *
 *  @param operations   上傳圖片預留參數(shù)---視具體情況而定 可移除
 *  @param imageArray   上傳的圖片數(shù)組
 *  @parm width      圖片要被壓縮到的寬度
 *  @param urlString    上傳的url
 *  @param successBlock 上傳成功的回調(diào)
 *  @param failureBlock 上傳失敗的回調(diào)
 *  @param progress     上傳進度
 */

+(void)uploadImageWithOperations:(NSDictionary *)operations withImageArray:(NSArray *)imageArray withtargetWidth:(CGFloat )width withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailurBlock:(requestFailure)failureBlock withUpLoadProgress:(uploadProgress)progress;


上傳圖片實現(xiàn)

/**
 *  上傳圖片
 *
 *  @param operations   上傳圖片等預留參數(shù)---視具體情況而定 可移除
 *  @param imageArray   上傳的圖片數(shù)組
 *  @parm width      圖片要被壓縮到的寬度
 *  @param urlString    上傳的url---請?zhí)顚懲暾膗rl
 *  @param successBlock 上傳成功的回調(diào)
 *  @param failureBlock 上傳失敗的回調(diào)
 *  @param progress     上傳進度
 *
 */
+(void)uploadImageWithOperations:(NSDictionary *)operations withImageArray:(NSArray *)imageArray withtargetWidth:(CGFloat )width withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailurBlock:(requestFailure)failureBlock withUpLoadProgress:(uploadProgress)progress;
{
    //1.創(chuàng)建管理者對象
      AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
     [manager POST:urlString parameters:operations constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        NSUInteger i = 0 ;
        
        /**出于性能考慮,將上傳圖片進行壓縮*/
        for (UIImage * image in imageArray) {
            
            //image的分類方法
            UIImage *  resizedImage =  [UIImage IMGCompressed:image targetWidth:width];
            
            NSData * imgData = UIImageJPEGRepresentation(resizedImage, .5);
            
            //拼接data
            [formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"picflie%ld",(long)i] fileName:@"image.png" mimeType:@" image/jpeg"];
            
            i++;
        }
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        progress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *  _Nullable responseObject) {
        
        successBlock(responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
       
        failureBlock(error);
        
    }];
}

視頻上傳

/**
 *  視頻上傳
 *
 *  @param operations   上傳視頻預留參數(shù)---視具體情況而定 可移除
 *  @param videoPath    上傳視頻的本地沙河路徑
 *  @param urlString     上傳的url
 *  @param successBlock 成功的回調(diào)
 *  @param failureBlock 失敗的回調(diào)
 *  @param progress     上傳的進度
 */
+(void)uploadVideoWithOperaitons:(NSDictionary *)operations withVideoPath:(NSString *)videoPath withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailureBlock:(requestFailure)failureBlock withUploadProgress:(uploadProgress)progress;

視頻上傳實現(xiàn)

/**
 *  視頻上傳
 *
 *  @param operations   上傳視頻預留參數(shù)---視具體情況而定 可移除
 *  @param videoPath    上傳視頻的本地沙河路徑
 *  @param urlString     上傳的url
 *  @param successBlock 成功的回調(diào)
 *  @param failureBlock 失敗的回調(diào)
 *  @param progress     上傳的進度
 */

+(void)uploadVideoWithOperaitons:(NSDictionary *)operations withVideoPath:(NSString *)videoPath withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailureBlock:(requestFailure)failureBlock withUploadProgress:(uploadProgress)progress
{
    
    
    /**獲得視頻資源*/
    
    AVURLAsset * avAsset = [AVURLAsset assetWithURL:[NSURL URLWithString:videoPath]];

    /**壓縮*/
    
//    NSString *const AVAssetExportPreset640x480;
//    NSString *const AVAssetExportPreset960x540;
//    NSString *const AVAssetExportPreset1280x720;
//    NSString *const AVAssetExportPreset1920x1080;
//    NSString *const AVAssetExportPreset3840x2160;
    
    AVAssetExportSession  *  avAssetExport = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset640x480];
    
    /**創(chuàng)建日期格式化器*/
    
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    
    [formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
    
    /**轉(zhuǎn)化后直接寫入Library---caches*/
    
    NSString *  videoWritePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingString:[NSString stringWithFormat:@"/output-%@.mp4",[formatter stringFromDate:[NSDate date]]]];
    
    
    avAssetExport.outputURL = [NSURL URLWithString:videoWritePath];
    
    
    avAssetExport.outputFileType =  AVFileTypeMPEG4;
    
    
    [avAssetExport exportAsynchronouslyWithCompletionHandler:^{
       
        
        switch ([avAssetExport status]) {
                
                
            case AVAssetExportSessionStatusCompleted:
            {
                
                
                
                AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
                
                [manager POST:urlString parameters:operations constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
                    
                    //獲得沙盒中的視頻內(nèi)容
                    
                    [formData appendPartWithFileURL:[NSURL fileURLWithPath:videoWritePath] name:@"write you want to writre" fileName:videoWritePath mimeType:@"video/mpeg4" error:nil];
                    
                } progress:^(NSProgress * _Nonnull uploadProgress) {
                    
                       progress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
                    
                } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *  _Nullable responseObject) {
                    
                    successBlock(responseObject);
                    
                } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                    
                    failureBlock(error);
                    
                }];
                
                break;
            }
            default:
                break;
        }
        
        
    }];

}

文件下載

#pragma mark - 文件下載


/**
 *  文件下載
 *
 *  @param operations   文件下載預留參數(shù)---視具體情況而定 可移除
 *  @param savePath     下載文件保存路徑
 *  @param urlString        請求的url
 *  @param successBlock 下載文件成功的回調(diào)
 *  @param failureBlock 下載文件失敗的回調(diào)
 *  @param progress     下載文件的進度顯示
 */

+(void)downLoadFileWithOperations:(NSDictionary *)operations withSavaPath:(NSString *)savePath withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailureBlock:(requestFailure)failureBlock withDownLoadProgress:(downloadProgress)progress

文件下載實現(xiàn)


/**
 *  文件下載
 *
 *  @param operations   文件下載預留參數(shù)---視具體情況而定 可移除
 *  @param savePath     下載文件保存路徑
 *  @param urlString        請求的url
 *  @param successBlock 下載文件成功的回調(diào)
 *  @param failureBlock 下載文件失敗的回調(diào)
 *  @param progress     下載文件的進度顯示
 */

+(void)downLoadFileWithOperations:(NSDictionary *)operations withSavaPath:(NSString *)savePath withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailureBlock:(requestFailure)failureBlock withDownLoadProgress:(downloadProgress)progress
{
    
    
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    
    [manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] progress:^(NSProgress * _Nonnull downloadProgress) {
        
        progress(downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);

        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        
                return  [NSURL URLWithString:savePath];
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        
        if (error) {
            
            failureBlock(error);
        }
        
    }];
    
}

取消指定的url請求

/**
 *  取消指定的url請求
 *
 *  @param requestType 該請求的請求類型
 *  @param string      該請求的url
 */

+(void)cancelHttpRequestWithRequestType:(NSString *)requestType requestUrlString:(NSString *)string;

取消指定的url請求實現(xiàn)

/**
 *  取消指定的url請求
 *
 *  @param requestType 該請求的請求類型
 *  @param string      該請求的完整url
 */

+(void)cancelHttpRequestWithRequestType:(NSString *)requestType requestUrlString:(NSString *)string
{
    
    NSError * error;
    
    /**根據(jù)請求的類型 以及 請求的url創(chuàng)建一個NSMutableURLRequest---通過該url去匹配請求隊列中是否有該url,如果有的話 那么就取消該請求*/
    
    NSString * urlToPeCanced = [[[[NetWorkManager shareManager].requestSerializer requestWithMethod:requestType URLString:string parameters:nil error:&error] URL] path];
    
    
    for (NSOperation * operation in [NetWorkManager shareManager].operationQueue.operations) {
        
        //如果是請求隊列
        if ([operation isKindOfClass:[NSURLSessionTask class]]) {
            
            //請求的類型匹配
            BOOL hasMatchRequestType = [requestType isEqualToString:[[(NSURLSessionTask *)operation currentRequest] HTTPMethod]];
            
            //請求的url匹配
            
            BOOL hasMatchRequestUrlString = [urlToPeCanced isEqualToString:[[[(NSURLSessionTask *)operation currentRequest] URL] path]];
            
            //兩項都匹配的話  取消該請求
            if (hasMatchRequestType&&hasMatchRequestUrlString) {
                
                [operation cancel];
                
            }
        }
        
    }
}

demo地址


notice

1.以上代碼僅供參考,如果有任何你覺得不對的地方,都可以聯(lián)系我,我會第一時間回復落君,謝謝.
qq:391565521 email:zhuhaifei_ios@163.com

持續(xù)完善中穿香,敬請期待.......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绎速,隨后出現(xiàn)的幾起案子皮获,更是在濱河造成了極大的恐慌,老刑警劉巖朝氓,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魔市,死亡現(xiàn)場離奇詭異主届,居然都是意外死亡赵哲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門君丁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫夺,“玉大人,你說我怎么就攤上這事绘闷∠鹋樱” “怎么了较坛?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扒最。 經(jīng)常有香客問我丑勤,道長,這世上最難降的妖魔是什么吧趣? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任法竞,我火速辦了婚禮,結(jié)果婚禮上强挫,老公的妹妹穿的比我還像新娘岔霸。我一直安慰自己,他們只是感情好俯渤,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布呆细。 她就那樣靜靜地躺著,像睡著了一般八匠。 火紅的嫁衣襯著肌膚如雪絮爷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天梨树,我揣著相機與錄音略水,去河邊找鬼。 笑死劝萤,一個胖子當著我的面吹牛渊涝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播床嫌,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼跨释,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厌处?” 一聲冷哼從身側(cè)響起鳖谈,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阔涉,沒想到半個月后缆娃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瑰排,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年贯要,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭住。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡崇渗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宅广,我是刑警寧澤葫掉,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站跟狱,受9級特大地震影響俭厚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驶臊,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一套腹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧资铡,春花似錦电禀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至店雅,卻和暖如春政基,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闹啦。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工沮明, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍奋。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓荐健,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琳袄。 傳聞我的和親對象是個殘疾皇子江场,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件窖逗、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • iOS開發(fā)系列--網(wǎng)絡開發(fā) 概覽 大部分應用程序都或多或少會牽扯到網(wǎng)絡開發(fā)址否,例如說新浪微博、微信等碎紊,這些應用本身可...
    lichengjin閱讀 3,639評論 2 7
  • 在蘋果徹底棄用NSURLConnection之后自己總結(jié)的一個網(wǎng)上的內(nèi)容佑附,加上自己寫的小Demo,很多都是借鑒網(wǎng)絡...
    付寒宇閱讀 4,260評論 2 13
  • 今天我滿懷期待仗考,我期待今天我可以高效的處理一切事物音同,我期待新年上班第一天可以信心滿滿,我期待自己第一天就可以做不急...
    小李非刀閱讀 807評論 1 0
  • 沿著鐵路走 踢著枕木上的小石子 悠閑的望著天空 享受這深一腳淺一腳的快樂
    一葉茶閱讀 129評論 0 1