2014-10-22 85 views
2

我遇到了NSURLConnection的問題,並花了超過3天的時間才找到解決方案 ,但不幸的是,我還沒有得到一個。 這裏是我的代碼,這是一個專門的類,並使用completehandler返回NSURLConnection在超時後卡住

NSURL *myUrl = [NSURL URLWithString:targetSite]; 
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:myUrl 
                   cachePolicy:NSURLRequestReloadIgnoringCacheData 
                  timeoutInterval:timeOutInterval]; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody:MYBODYCONTENT]; 
    conn = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
    if(conn) 
    { 
     webData = [NSMutableData data]; 
    } 

,並使用委託來接收數據,它工作在「didReceiveResponse」精「didReceiveData」,「didFailWithError」,「connectionDidFinishLoading」 ...

但是,如果一個請求超時happend,(我已經做了在「didFailWithError」 [康恩取消])
然後,在一段時間peroid(我沒有做精確的計數,但約1分鐘) 我對同一臺服務器的所有新請求(再次請求)都會一次又一次地超時。
有什麼我做錯了嗎?
或任何我應該修改我的代碼?
我已經嘗試了很多解決方案,但仍然沒有去。
所以,尋求一些幫助,謝謝。

+0

您確定連接到服務器沒有問題嗎?這可能與您的網絡或連接到的服務器有關。如果請求超時,您可能需要等待一分鐘以重試相同的請求。 – 2014-10-22 06:03:22

回答

1

一個常見的問題是,如果你發起了很多NSURLConnection請求,它只能同時運行一定數量(通常是4或5)。因此,如果您發起的不僅僅是這個,它一次只能運行其中的一部分,其他所有其他部分都會積壓,等待其中一個插槽可用。可悲的是,如果這需要一分多鐘,後面的請求可能會超時。

解決方法之一是將NSURLConnection對象包裝在自定義NSOperation子類中。然後,您可以將它們添加到NSOperationQueue,而不是隻是一次性啓動連接,讓操作隊列決定何時啓動它們。因此,如果將該隊列的maxConcurrentOperationCount定義爲4或5,則操作隊列不會嘗試同時啓動它們,從而解決了NSURLConnection超時問題。

有關如何繼承NSOperation併發操作,見配置Operations爲Concurrency Programming Guide: Operation Queues的併發執行部分背景。請參閱https://stackoverflow.com/a/24943851/1271826以瞭解NSOperation子類中包裝對象NSURLConnection的演示。

更好的是,如果您不希望迷失細節,請考慮使用AFNetworking,它使用操作隊列解決方案(至少對於AFHTTPRequestOperationManager)。只要確保將管理器的操作隊列的maxConcurrentOperationCount設置爲4,然後可以根據需要添加儘可能多的網絡操作,操作隊列將確保它們不會超時。