iOS開發之網路程式設計篇三:同步,非同步請求差異及用法
在網路請求方式上,有同步和非同步之分,相關內容涉及到執行緒部分知識,這一節咱們需要知道如何去傳送一個同步或者非同步的請求,以及它們二者的區別。
一、同步請求
在網路程式設計第二篇,咱們寫的get,post請求使用的都是同步請求,那結合同步非同步、get/post組合在一起,有同步get、同步post、非同步get、非同步post。大多數情況下出於效能和使用者互動上的體驗的考慮,用的是非同步post或者非同步get,具體是post還是get看伺服器是否有明確要求。如果對上一章的程式碼有不熟悉或者需要回憶的地方,可以通過下面連結,去重溫一下:
在執行第二篇文章的工程時,如果沒有網路因素的干擾,大家可以感受到進入專案的時間偏長。因為根檢視控制器在viewdidload:裡面,需要傳送網路請求,由於是同步請求,所以如果沒有拿到伺服器資料之前,我們是看不到根檢視控制器的,這還僅僅是傳送了一次同步請求。試想一下,類似於網易新聞,主頁面是一個tableView,每次滑動tableView,上拉載入更多的時候,是不是得卡成一副死樣。罪魁禍首就是[
既然大家知道這是同步,那NSURLConnection肯定還有一個非同步傳送請求的方法咯。
二、非同步請求
下面咱們可以依舊用上一次的程式碼,只不過把同步改成非同步,鑑於get請求省去了很多麻煩,那我就把麻煩留給自己吧,寫一個post的非同步請求,大家改成get請求只需要稍稍修改一下request的建立就好了(還是要記得修改iOS9的網路適配):
- #pragma mark - post非同步請求
- // 1.獲取請求網址
- NSURL *url =[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?"];
- // 2.封裝請求
- NSMutableURLRequest*request =[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];// post
- // 設定請求方式
- [request setHTTPMethod:@"POST"];
- // 設定請求體(會把請求的資料轉成data,達到使用者資訊保密的目的)
- NSData*data =[@"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" dataUsingEncoding:NSUTF8StringEncoding];
- [request setHTTPBody:data];
- // 3.傳送請求
- [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse*_Nullable response,NSData*_Nullable data,NSError*_Nullable connectionError){
- NSError*newError =nil;
- // 獲取資料
- NSDictionary*dict =[NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainers error:&newError];
- NSArray*array = dict[@"news"];
- NSDictionary*dic = array[0];
- NSLog(@"%@", dic[@"title"]);
- }];
三、總結
主要區別還是在3.傳送請求這裡,sendAsynchronousRequest:有幾個引數,第一個請求不需要介紹了,第二個是執行緒,前面說過這裡會涉及到執行緒相關知識,只需要記住這裡只用在主執行緒就可以了(一般接收到資料後回到主執行緒,有些時候還是按需求而定),然後就是後面的block,通過回撥獲得請求的資料。這就是為什麼它能夠做到非同步。粗略的理解就是,使用者的點選操作都是在主執行緒完成的,如果你在主執行緒裡傳送網路請求,獲取伺服器響應,那麼使用者的操作就會被阻塞,使得應用就跟死了一樣,不會接收到使用者的任何操作。非同步傳送請求,會將網路請求響應這一塊放到一個新的執行緒,使用者還是可以該做什麼做什麼,互不干擾,當獲取到伺服器資料,就需要回到主執行緒,來顯示和處理這些資料,這也是為什麼queue:的引數是[NSOperationQueue mainQueue]。
舉一個平常咱們經常會看到的例子:你在用這一類app看新聞或者刷貼吧的時候,有沒有注意到經常我們滑動到下面的檢視,上面的圖片並沒有全部都顯示上去,而是過一會,圖片就自動出現了。這就是非同步的效果,如果是同步請求,不等到圖片被請求下來,你的介面只會卡在哪裡,你什麼也幹不了,是不是很反人類?