iOS 網絡請求/數據獲取/圖片上傳及加載/多線程加載圖片/數據非空處理

前言

1.網絡請求

系統請求的方法

分為get請求和post請求
1.1、get請求系統提供了兩種方法,一種是Request方式的,一種是URL方式的。下面先說request方式的

NSString * urlStr = @"http://172.16.101.125:8080/wisdombus-controller/mobile/class/queryBusLineList?corpId=0";
NSURL * url = [NSURL URLWithString:urlStr];
NSURLSession * senssion = [NSURLSession sharedSession];//網絡請求管理者
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];//創建請求對象
//創建網絡數據請求任務的對象
NSURLSessionDataTask * task1 = [senssion dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //由NSData對象獲取json字符串
        NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",string);
        //NSData數據轉字典
        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@",dic);
        //回到主線程
        [self performSelector:@selector(actionWithString:) onThread:[NSThread mainThread] withObject:string waitUntilDone:YES];
    }];
[task1 resume];

get請求url方式

NSString * urlStr = @"http://172.16.101.125:8080/wisdombus-controller/mobile/class/queryBusLineList?corpId=0";
NSURL * url = [NSURL URLWithString:urlStr];
//網絡請求管理者
NSURLSession * senssion = [NSURLSession sharedSession];
//創建網絡數據請求任務的對象
NSURLSessionDataTask * task2 = [senssion dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //獲取json字符串
        NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",string);
    }];
[task2 resume];

1.2、post請求

NSString * urlStr = @"http://172.16.101.125:8080/wisdombus-controller/mobile/class/queryBusLineList";
NSURL * url = [NSURL URLWithString:urlStr];
NSURLSession * senssion = [NSURLSession sharedSession];//網絡請求管理者
NSMutableURLRequest * Postrequest = [NSMutableURLRequest requestWithURL:url];
Postrequest.HTTPMethod = @"POST";
    //設置包體
Postrequest.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];
    //創建任務
    NSURLSessionDataTask * task = [senssion dataTaskWithRequest:Postrequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:0 error:nil]);
        NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        [self performSelector:@selector(actionWithString:) onThread:[NSThread mainThread] withObject:string waitUntilDone:YES];
    }];
[task resume];
第三方網絡請求--AFNetWorking

在使用網絡請求的控制器中引入頭文件

#import <AFNetworking/AFNetworking.h>

創建請求管理者,并設置相關屬性

//創建請求管理者
AFHTTPSessionManager * sessionManager = [AFHTTPSessionManager manager];
//上傳設置
sessionManager.requestSerializer = [AFHTTPRequestSerializer serializer];//普通格式上傳
//sessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上傳JSON格式
sessionManager.requestSerializer.timeoutInterval = 10.0f;
//返回數據設置
sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];//自己動手解析
//sessionManager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN會JSON解析返回的數據
// 個人建議還是自己解析的比較好,有時接口返回的數據不合格會報3840錯誤,大致是AFN無法解析返回來的數據

sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"text/json", @"application/json", @"text/javascript", @"text/html",@"charset=utf-8",  nil];
//創建參數和參數值字典
NSDictionary * dic = @{@"corpId":@"0"};
NSString * urlString = @"http://172.16.101.125:8080/wisdombus-controller/mobile/class/queryBusLineList";

post請求

[sessionManager POST:urlString parameters:dic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@",responseObject);
        self.textView2.text = [NSString stringWithFormat:@"%@",responseObject];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
}];

get請求

[sessionManager GET:urlString parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@",responseObject);
        self.textView2.text = [NSString stringWithFormat:@"%@",responseObject];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
}];

注意:系統的網絡請求的block中請求改變外部變量需要做特殊處理,但是第三方的不需要

2.獲取數據,并處理數據

對于數據的處理主要是兩種:
一種是NSData轉json字符串

NSString * string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

一種是NSData數據轉字典

NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

3.獲取導數據后的非空處理

對于獲取到的數據,如果不做非空處理,很容易出現數組越界的情況。所以必須得處理,但是不同的后臺開發人員,寫的接口字段非空時返回的形式多種多樣,所以要綜合處理多種情況,才能避免出錯。
1、對于數組對象,需要判斷元素的個數和數組是否為空

if (self.busLineArr.count == 0||self.busLineArr == nil) {
        [self showErrorMessage:@"暫時不能進行切換"];
        return;
    }

2、對于字符串對象,需要判斷nil、NSNull對象、@“”、@“null”,等4種情況

if (([str isKindOfClass:[NSNull class]]||str == nil||[[NSString stringWithFormat:@"%@",str] length] < 1||[[NSString stringWithFormat:@"%@",str] isEqualToString:@"(null)"])) {//字符串對象為空
 
}else{//不為空

}

4.圖片的上傳

圖片上傳格式比較固定

NSError *error = nil;
NSURLResponse *response = [NSURLResponse new];
NSString *imageStr = @"http://172.16.101.125:8080/wisdombus-controller/mobile/auth/uploadIMG.do";
NSURL *url = [NSURL URLWithString:imageStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 設置請求方法
[request setHTTPMethod:@"POST"];
// 設置請求體
[request setHTTPBody:_imageData];
// 設置請求頭的內容的類型
[request setValue:[NSString stringWithFormat:@"cesi%.0f.png",[[NSDate date] timeIntervalSince1970]] forHTTPHeaderField:@"fileName"];//圖片文件名字
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)_imageData.length] forHTTPHeaderField:@"fileSize"];//大小
[request setValue:[NSString stringWithFormat:@"%@"[[NSUserDefaults standardUserDefaults] objectForKey:@"uuid"]] forHTTPHeaderField:@"userId"];//
[request setValue:[NSString stringWithFormat:@"%d",2] forHTTPHeaderField:@"type"];
NSString *contentType = [NSString stringWithFormat:@"Content-Type multipart/form-data; boundary=%@", kBoundary];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
// 發送異步請求
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!error && responseData) {
  NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];
     if ([[dic objectForKey:@"result"] isEqualToString:@"true"]) {
        //上傳成功
     }else {
         //上傳錯誤
     }
    }else if (error) {
      //操作失敗
}

5.圖片的下載問題

圖片加載影響主線程,所以要放到子線程中這里用GCD加載

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
     NSString * urlStr = @"http://img.taopic.com/uploads/allimg/140326/235113-1403260I05466.jpg";
     UIImage * userImag = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]];
      if (userImag != nil) {//請求成功
           dispatch_async(dispatch_get_main_queue(), ^{//返回主線程
                self.imageView.image = userImag;
           });
      }else{//請求失敗,或請求不到圖片

      }
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,375評論 0 12
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • iOS開發系列--網絡開發 概覽 大部分應用程序都或多或少會牽扯到網絡開發,例如說新浪微博、微信等,這些應用本身可...
    lichengjin閱讀 3,705評論 2 7
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,079評論 6 13
  • 材料:米2米杯,馬鈴薯2顆、紅蘿蔔1根、洋蔥半顆、蘑菇5、6朵,豬絞肉200克左右,蒜3瓣,熟豌豆或熟毛豆半碗 調...
    鑽進烤箱的獅子閱讀 390評論 0 3