同步與非同步訪問網路

2021-07-05 05:11:43 字數 4757 閱讀 4894

訪問網路的基本流程

同步請求與非同步請求的比較

//1、構建url位址

nsurl *url = [nsurl urlwithstring:@"**"];

//2、構建請求nsurlrequest,nsurlrequest:不可變物件,不能動態的新增請求資訊

nsmutableurlrequest *request = [nsmutableurlrequest requestwithurl:url];

[request sethttpmethod:@"get"]; 設定請求方式,都大寫

[request settimeoutinterval:60]; 設定超時時間

設定請求頭資訊

[request sethttpbody:data]; 設定請求體

[request setcachepolicy:nsurlrequestreturncachedataelseload]; 設定快取策略

//3、構造nsurlconnection

//傳送同步請求

nsdata *data = [nsurlconnection sendsynchronousrequest:request

returningresponse:&response

error:&error];

//4、獲取資料顯示---響應

//將data轉為字串

nsstring *jsonstr = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];

_textview.text = jsonstr;

//解析json資料

nsdictionary *dic = [nsjsonserialization jsonobjectwithdata:data

options:nsjsonreadingmutablecontainers

error:nil];

nslog(@"資料結果: %@", dic);

//5、獲取響應資訊

nsinteger statuscode = response.statuscode;

nsdictionary *allheaderfields = response.allheaderfields;

nslog(@"statuscode is %ld", statuscode);

nslog(@"allheaderfields is %@", allheaderfields);

//——————————非同步請求方法一:block示例

無法監聽資料,也無法監聽進度

//1、構建url

nsurl *url = [nsurl urlwithstring:@""];

//2、構建request

//新增資料請求—請求體

//3、傳送請求

nsoperationqueue *queue = [[nsoperationqueue alloc] init];

[nsurlconnection sendasynchronousrequest:request

queue:queue

completionhandler:^(nsurlresponse *response, nsdata *data, nserror *connectionerror)

//此時是在多執行緒中

nsstring *jsonstr = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];

//回到主線程中重新整理ui

dispatch_async(dispatch_get_main_queue(), ^);

}];

無法監聽資料,也無法監聽進度

//1、構建url

nsurl *url = [nsurl urlwithstring:@""];

//2、構建request

//新增資料請求—請求體

//3、傳送請求

nsoperationqueue *queue = [[nsoperationqueue alloc] init];

[nsurlconnection sendasynchronousrequest:request

queue:queue

completionhandler:^(nsurlresponse *response, nsdata *data, nserror *connectionerror)

//此時是在多執行緒中

nsstring *jsonstr = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];

//回到主線程中重新整理ui

dispatch_async(dispatch_get_main_queue(), ^);

}];

//1、構建url

nsurl *url = [nsurl urlwithstring:@""];

//2、構建request

//新增資料請求

//3、傳送請求

[nsurlconnection connectionwithrequest:request delegate:self];

/*通訊協議:nsurlconnectiondelegate

方法:1、nsurlconnectiondatadelegate

2、nsurlconnectiondownloaddelegate

子協議*/

#pragma mark -nsurlconnectiondatadelegate協議方法

//接受到伺服器的響應

//資料接收完成,在此方法中,把檔案寫進沙盒裡,

- (void)connectiondidfinishloading:(nsurlconnection *)connection;

//請求失敗時呼叫的協議方法

- (void)connection:(nsurlconnection *)connection didfailwitherror:(nserror *)error;

//將資料儲存進沙盒

//將接收到的資料儲存到沙盒裡

開闢乙個子執行緒,在子執行緒中同步請求,然後回到主線程設定ui

子執行緒呼叫的方法最好加到自動釋放池中去

@autoreleasepool

[toc]來生成目錄:

同步與非同步

同步執行模式 所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至 程式結束。如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將 一直等待伺服器將查詢結果返回客戶機端,然後才繼續進行下一步操作。眾所周知,應用程式要從乙個大表中刪除所有的記錄將是非常耗時的,如果應用...

同步與非同步

同步與非同步 所謂同步就是乙個任務的完成需要依賴另外乙個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。而非同步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完...

同步與非同步

1.所謂同步,可以理解為在執行完乙個函式或方法之後,一直等待系統返回值或訊息,這時程式是出於阻塞的,只有接收到返回的值或訊息後才往下執行其他的命令。非同步,執行完函式或方法後,不必阻塞性地等待返回值或訊息,只需要向系統委託乙個非同步過程,那麼當系統接收到返回值或訊息時,系統會自動觸發委託的非同步過程...