2013-04-17 150 views
0

我從applicationDidBecomeActive方法的服務器獲取數據。當網絡連接速度太慢時,應用程序不斷崩潰。我不知道如何處理這個問題。任何幫助將不勝感激。提前感謝。應用程序在Internet上崩潰

NSString *post =[[NSString alloc] initWithFormat:@"=%@@=%@",myString,acMobileno]; 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:///?data=%@&no=%@",myString,acMobileno]]; 

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

    [request setURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 

    NSError *error1 = [[NSError alloc] init]; 
    NSHTTPURLResponse *response = nil; 
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1]; 
    NSString *string; 
    if ([response statusCode] >=200 && [response statusCode] <300) 
      { 
      string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding]; 

      } 
+0

發佈您的代碼? – Ramz

+0

我發佈了我的代碼。 – user2134883

+0

崩潰說什麼? –

回答

1

它可能崩潰,因爲連接已經開始下載,但它並沒有因此結束,允許編譯器通過您的if語句,這將不可避免地給一個零urlData參數。

要解決此問題,您應該檢查是否有錯誤,然後檢查下載的響應標頭。另外,我建議在後臺線程上運行此操作,以免它阻止用戶體驗 - 目前,根據文件大小和用戶的下載速度,應用程序將延遲啓動。

NSError *error1 = nil; 
NSHTTPURLResponse *response = nil; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1]; 
NSString *string = nil; 
if (error != nil && ([response statusCode] >=200 && [response statusCode] <300)){ 
    string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding]; 
} 
else { 
    NSLog(@"received error: %@", error.localizedDescription); 
} 

後臺線程,運行在一個dispatch_async聲明上面的代碼,或者使用-sendAsynchronousRequest:代替-sendSynchronousRequest

或者,正如@Viral所說,請求可能會花費太長時間,並且由於同步請求在應該加載UI之前沒有完成而導致應用程序掛起。

+0

可以給你dispatch_async語句的例子嗎? – user2134883

+0

@ user2134883在stackoverflow上有很多例子。這裏是[一](http://stackoverflow.com/a/8636840/1576979)。請記住,在後臺線程中,您可以通過使用dispatch_async(dispatch_get_main_queue()^ {//您的代碼在這裏});''切換到主線程來執行GUI操作或其他所需的東西。 – tolgamorf

1

很可能是由於Application的委託方法中的同步調用。加載UI需要花費太多時間(因爲互聯網連接速度慢,而且您正在主線程上調用Web服務);因此操作系統認爲你的應用程序由於無響應的用戶界面而被吊死並導致應用程序本身崩潰。

僅用於調試目的,請在您的FirstViewControllerviewDidAppear方法中嘗試使用相同的代碼。它應該在那裏工作得很好。如果是這樣,你需要改變你的呼叫到其他地方(也最好在一些後臺線程或異步)。

編輯:雖然,如果它在其他地方工作,你需要改變調用爲後臺線程上的異步或更平滑的用戶體驗。

+0

我可以在performSelectorInBackGround方法中運行整個代碼嗎? – user2134883

+0

是的,你可以。 **一個建議:**使用簡單但效率不高的解決方案可能會在不久的將來失敗。至少,它們不可擴展。 – viral