NSURLConnection蘋果官方文件

2021-06-21 11:05:56 字數 3662 閱讀 5130

這篇文章是翻譯的蘋果官方文件,想要看英文原版的可以到蘋果**檢視 

也提供了乙個簡單的介面去建立和放棄連線,同時使用很多的delegate   

方法去支援連線過程的反饋和控制   

如何建立乙個連線呢?   

connection:didreceiveresponse:,conncetion:didreceivedata,   

conncetion:didfailwitherror:和connectiondidfinishloading:   

舉例一:   

1、先建立乙個nsurl   

2、在通過nsurl建立nsurlrequest,可以指定快取規則和超時時間   

3、建立nsurlconnection例項,指定nsurlrequest和乙個delegate物件   

如果建立失敗,則會返回nil,如果建立成功則建立乙個nsmutalbedata的例項用來儲存資料   

**:   

nsurlrequest *therequest=[nsurlrequest requestwithurl:   

[nsurl urlwithstring:@「 

cachepolicy:nsurlrequestuseprotocolcachepolicy   

timeoutinterval:60.0];   

nsurlconnection *theconncetion=[[nsurlconnection alloc]        

initwithrequest:therequest delegate:self];   

if(theconnection)   

{   

//建立nsmutabledata 

receiveddata=[[nsmutabledata data] retain];   

}else

建立失敗   

nsurlconnection還有幾個初始化函式,有個初始化函式可以做到建立連線但是並   

收到connectiondidfinishloading:或者connection:didfailwitherror:訊息之前   

當伺服器提供了足夠客戶程式建立nsurlresponse物件的資訊時,**物件會收到   

乙個connection:didreceiveresponse:訊息,在訊息內可以檢查nsurlresponse   

物件和確定資料的預期長途,mime型別,檔名以及其他伺服器提供的元資訊   

要注意,乙個簡單的連線也可能會收到多個connection:didreceiveresponse:訊息   

當伺服器連線重置或者一些罕見的原因(比如多組mime文件),**都會收到該訊息   

這時候應該重置進度指示,丟棄之前接收的資料   

-(void

)connection:(nsurlconnection *)connectiondidreceiveresponse:   

(nsurlresponse*)response   

{   

[receivedata setlength:0];   

}   

**應當在實現中儲存新接收的資料,下面的例子既是如此   

-(void

) connection:(nsurlconnection*)connection didreceivedata:   

(nsdata *) data   

{   

}   

訊息引數裡面的nserror物件提供了具體的錯誤細節,它也能提供在使用者資訊字典裡面失敗的   

url請求(使用nserro***ilingurlstringkey)   

當**接收到連線的connection:didfailwitherror訊息後,對於該連線不會在收到任何訊息   

舉例   

-(void

)connection:(nsurlconnection*)connection didfailwitherror:(nserror*)error   

{   

[connection release];   

[receiveddata release];   

nslog(@"connection failed! error - %@ %@"

,   

[error localizeddescription],   

[[error userinfo] objectforkey:nserro***ilingurlstringerrorkey]);   

}   

**不會收到其他的訊息了,在訊息的實現中,應該釋放掉連線   

舉例:   

-(oid)connectiondidfinishloading:(nsurlconnection*)connection   

{   

//do something with the data 

nslog(@「succeeded  %d byte received」,[receiveddata length]);   

[connection release];   

[receiveddata release];   

}   

好的,初步的流程就是這些   

網路層是ios開發必須掌握的部分,蘋果已經將網路請求封裝得非常易用了,看看nsurlrequest和nsurlconnection的文件,你就知道怎麼用了。本文主要講網路層的呼叫邏輯,以及如何優化你的網路請求,讓請求更有效率。

正常的網路請求的過程一般經歷四個過程:

1.組裝request物件,建立connection物件,當connection建立完畢後,系統底層會幫你完成3次握手、建立真正的連線等操作

2.收到回應,會呼叫connectiondelegate的didreceiveresponse方法,這是接收資料的第一步,你需要建立乙個data緩衝區

3.然後一點點接收資料,會重複呼叫didreceivedata,這個方法被呼叫的次數取決於裝置當時的網路狀況和資料總量,你需要把接收到的資料一點點追加到data緩衝區裡

4.接收完成,會呼叫connectiondidfinishloading方法,表明資料全部接收完畢。

a:整個過程是非同步的,但delegate方法永遠會在主線程執行,蘋果為保證動畫(如scrollview滑動)的流暢,給了動畫最高的優先順序,所以介面動畫會阻塞以上任意乙個過程,保證介面不被卡住。於是你應該明白了,盡量不要在做動畫的時候去發網路請求,這是徒勞的。

b:當有若干個網路請求同時傳送時,connection物件可以幾乎同時被構建,但系統底層未必會為所有的連線物件都建立真正的網路連線,至於底層最多能同時建立多少個真正的網路連線,我還不清楚。建立了網路連線的請求,哪個先收到response,就先處理哪個,處理的過程是2-3-4過程依次呼叫,直到乙個請求處理完畢,才接收下乙個。於是你應該明白了,要避免同時傳送多個請求,尤其是關乎更新介面的請求,一定要單獨發。

c:如果網路請求進行了一半時退出程式,大家都知道這時候程式會被掛起,那麼網路連線怎麼辦呢?實際上當程式退出時,系統並不會立即掛起應用程序,而是會延遲大概一秒,如果這樣請求還是沒有完成,系統底層會默默地幫你把資料都接收完,幫你儲存請求超時時間那麼久。比如你設定超時時間30s,30s內重新開啟應用,資料就立刻全都一次性收到,如果沒開啟,不好意思,下次開啟程式時,delegate的didfailwitherror方法會被呼叫,通知你請求超時了。

網路請求 NSURLConnection

http和https http協議,hyper transfer protocol 超文字傳輸協議 是用於全球資訊網 www 伺服器傳送超文字到本地瀏覽器的傳輸協議,http是乙個應用層協議,由請求和響應構成,是乙個標準的客戶端伺服器模型.工作原理 http協議採用請求 響應模型.客戶端向伺服器傳送...

NSURLConnection 非同步請求

匯入第三方庫svprogresshud import viewcontroller.h import svprogresshud.h import mjrefresh.h inte ce viewcontroller property retain nsmutablearray datasource...

NSURLConnection同步與非同步請求

非同步請求 nsmutabledata buf nsmutabledata alloc initwithlength 0 nsurlconnection connection nsurlconnection alloc initwithrequest req delegate self 收到響應時,...