這篇文章是翻譯的蘋果官方文件,想要看英文原版的可以到蘋果**檢視
也提供了乙個簡單的介面去建立和放棄連線,同時使用很多的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 收到響應時,...