網絡延遲包括在手機與運營商網絡間建立連接的時間、建立 TCP 連接的時間, 可能還有協商 SSL 連接的時間, 以及發送與接收 HTTP 請求的時間. 實際上, 在 iOS 設備上, 我們沒有辦法降低單個網絡請求的延遲, 不過可以通過一些技術來降低多個請求的延遲. 本節將會介紹如何降低應用的網絡請求所消耗的潛在時間
對于應用所需的一小塊數據來說, 每次都建立并關閉一條 TCP 連接是非常不明智的. 降低請求延遲有兩項最佳實踐: 在單個 TCP 連接上發送 HTTP 請求, 以管道的形式發送 HTTP 請求, 從而優化全雙工 TCP 連接的使用
你的應用可能已經在使用 HTTP 請求集群了, 因為 iOS 默認情況下就是這樣做的. 當應用使用完 NSURLConnection 對象后, 操作系統在關閉連接前會保持它開啟幾秒鐘, 通常是 10 秒. 這項技術也可以在更高的層次上使用, 保持不重要的更新, 直到積累了足夠的批量數據或是某些用戶動作需要網絡活動為止. 接下來, 應用可以按照順序執行所有的隊列請求, 在這個過程中一直保持激活相同的連接, 避免建立多個 TCP 連接的開銷
另一種方式是使用單個服務端點來架構服務層, 它會將請求代理給組織內外的其他服務. 這種方式可以通過讓應用對不同的活動重用單個連接而避免延遲
HTTP 管道是重用現有 TCP 連接的第三種方式. 它使得 HTTP 客戶端能夠在對第一個請求的響應返回前在相同的 TCP Socket 上發送第二個請求. 響應返回的順序與請求發起的順序保持一致.
由于 POST 與 PUT 命令會修改服務器上的實體, 因此我們建議不要對這樣的請求使用管道
NSURLRequest 開啟管道支持:
使用這種方式時需要對目標服務器進行廣泛測試, 因為并非所有的服務器都支持 HTTP 管道. Apache 與 IIS 都支持管道, 無需任何額外配置