iPhone網路開發之如何使用NSURLCon

2021-06-26 11:52:38 字數 3532 閱讀 1764

[cpp]

view plain

copy

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

也提供了乙個簡單的介面去建立和放棄連線,同時使用很多的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方法會被呼叫,通知你請求超時了。

iphone開發之SQLite使用詳解

原文 sqlite是乙個開源的嵌入式關聯式資料庫,它在2000年由d.richard hipp發布,它的減少應用程式管理資料的開銷,sqlite可移植性好,很容易使用,很小,高效而且可靠。sqlite嵌入到使用它的應用程式中,它們共用相同的程序空間,而不是單獨的乙個程序。從外部看,它並不像乙個rdb...

iPhone網路使用

一 確認網路環境3g wifi 1.新增原始檔和framework 1.建立nsconnection物件,設定委託物件 nsmutableurlrequest request nsmutableurlrequest requestwithurl nsurl urlwithstring self ur...

iPhone 網路開發介紹

from 系統總介紹 url loading系統是乙個類和協議的集合,為應用程式通過url訪問資料提供支援 共有五個類別 url loading cache management authentication and credentials cookie storage protocol suppo...