2011-08-26 92 views
1

請看下面的代碼:如何爲NSURLConnection請求設置實時超時?

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:<...> cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:3.0]; 
<...> 
[NSURLConnection sendSynchronousRequest:request returningResponse:&WSresponse error:&WSerror] 

此代碼波紋管是由後臺線程調用:

[self performSelectorInBackground:@selector(<...>) withObject:nil]; 

有時sendSynchronousRequest的效果要大於3.0秒。 (最多1分鐘)。

  1. 如何設置實時超時而不是工作timeoutInterval:3.0
  2. 如何添加一個用戶在任何時候停止凍結的能力NSURLConnection取消按鈕的請求?

非常感謝您的幫助!

回答

3
  1. 請注意,除了您調用的初始化程序之外,還可以在NSMutableURLRequest上調用-setTimoutInterval:。超時值確實有效,但是忽略小於240的任何值 - 這是iOS框架所要求的最小值。如果你想設置一個較低的超時值,那麼你唯一的選擇是使用異步請求。

  2. 如果您想異步取消請求(即,在後臺執行請求並允許前臺UI線程發出取消以響應用戶點擊取消或停止按鈕),那麼您必須一個異步URL請求。無法通過同步請求執行此操作。例如,當它正在執行一個塊時,你甚至不能殺死一個調度隊列。

你可能想看看ASIHTTPRequest,它包含了這個功能有些不同。

+0

提醒:ASIHTTPRequest未得到積極維護 –

2

超時時間間隔僅描述了連接在超時之前的任何時刻可以空閒的時間量。從Apple文檔:

如果連接嘗試的請求保持空閒時間超過超時 間隔較長時,該請求被認爲已經超時。

因此,如果您的數據正在檢索任何大量的數據,則需要更長的時間。

如果您希望在您「停止監聽」之前有更多的控制權,那麼您應該使用異步請求。異步請求也會使用戶在等待時看不到凍結。

+0

感謝您的回答!但我想添加一個按鈕取消以在任何時候停止請求。這個怎麼做? – Dmitry

+1

你可以在你提出請求的NSURLConnection上調用取消方法(假設你保存了對它的引用)。這應該防止未來的回調被髮送到您的代理。 –

+0

@Tim Deam - 只有在主線程上調用同步IO時,* no-freezing *註釋纔有效。在後臺線程上,由於代碼複雜性大大降低,所以同步IO可能是首選。 – PeyloW