2013-04-30 98 views
1

我使用NSURLConnection initWithRequest從服務器獲取一些數據。這可以在服務器可用時正常工作。但是,當服務器不可用時,我的應用程序會掛起並在至少40-50秒內完全無響應。我試過使用timeoutInterval以及一個定時器來取消請求。但是我的應用仍然掛起。NSURLConnection掛起服務器不可用

雖然我的應用掛起,但沒有調用NSURLConnectionDelegate方法。 onTimeExpire被調用但沒有做任何事情。一旦應用程序再次變得響應(50秒後...),NSURLConnectionDelegatedelegate方法被調用,並且一切都很好...

服務器是一個本地服務器,它的IP地址爲192.168.xx,它將數據拉到應用程序只有在服務器(和csv)文件可用時。

我想在開始NSURLConnection之前做一個簡單的檢查,看看服務器是否先聯機。但似乎無法解決如何做到這一點?有任何想法嗎?

-(id) loadCSVByURL:(NSString *)urlString 
{ 

// Create the request. 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0f]; 


    self.timer = [NSTimer scheduledTimerWithTimeInterval:20 //for testing.. 
              target:self 
              selector:@selector(onTimeExpired) 
              userInfo:nil 
              repeats:NO];  

    (void)[self.connection initWithRequest:request delegate:self]; 

    //THE APP HANGS HERE!!! 
    return self; 
} 

-(void)onTimeExpired 
{ 
    NSLog(@"cancelling connection now!"); 
    [self.connection cancel]; 
} 
+1

這與Xcode無關。 – 2013-04-30 06:02:34

+0

你用模擬器和設備試過這個嗎?如果在掛起時在調試器中按「暫停」,它停在哪裏? – 2013-04-30 06:38:04

+0

用戶界面鎖定模擬器和設備。當我點擊暫停時,線程1顯示main.m並且'return'行高亮顯示: return UIApplicationMain(argc,argv,nil,NSStringFromClass([xmlLoaderAppDelegate class])); – ack 2013-04-30 07:02:22

回答

2

要設置20的超時但30連接超時這意味着,即使你的設置是正確的,那麼定時器不成功的連接失敗之前進行發射。

更重要的是,您正在向您的connection對象發送兩次init消息。這根本不符合邏輯。

您需要改爲創建與請求的連接,然後start它。

self.connection = [[NSURLConnection alloc] 
         initWithRequest:request delegate:self]; 
[connection start]; 

你那麼反應在NSURLConnectionDelegate回調connection:didFailWithError:連接超時後啓動時機的連接失敗。

+0

謝謝。我提出了建議的更改。然而,主要問題仍然存在 - 只要我打電話[連接開始]我的應用程序掛起,並沒有反應。例如,我無法選擇任何其他的標籤欄項目。只是試驗 - >如果我將timeoutInterval設置爲像10(和更大的定時器)那樣小的東西,它會在10秒後超時並在10秒後調用connection:didFailWithError:方法。但是,我的應用程序鎖定了10秒。當我使計時器變小(並且timeoutInterval變大)時,它會調用我的超時方法,並因此調用[self.connection cancel];並且該應用程序變得響應 – ack 2013-04-30 14:31:38

+0

它應該是異步的。嘗試instaed'initWithRequest:delegate:startImmediately:'某事正在鎖定您的用戶界面,但它不是連接。在'viewDidLoad'中執行此操作,而不是在init方法中執行。 – Mundi 2013-04-30 19:31:11

+0

我解決了這個問題 - 正如你所說它是異步的,所以它不是鎖定應用程序的連接。我正在選擇另一個標籤欄項目,它本身鎖定了應用程序。傻我:(無論如何,非常感謝您的幫助:) – ack 2013-04-30 23:47:46