2011-11-02 71 views
6

我使用sendSynchronousRequest從服務器獲取數據。我知道同步將等待,直到收到該請求的數據。NSURLConnection sendSynchronousRequest - 前臺背景

但是,當用戶錯誤地進入一些不存在的url並且試圖獲得響應時,問題就出現了。在這種情況下,如果用戶進入後臺並且進入前臺,則只顯示黑屏。它只顯示狀態欄。也沒有顯示任何後臺應用程序。我必須按下主頁按鈕才能出來我的應用程序。

在模擬器上,經過1分鐘後,它向我顯示「請求超時」(沒有崩潰)消息。

在設備上,1分鐘內應用程序崩潰。

任何建議。任何幫助。這在我的應用程序中確實是一個嚴重的問題。

謝謝。

+0

你崩潰之前得到控制檯的東西。 – iamsult

+0

請發佈一些崩潰日誌。 – HelmiB

回答

14

就像朱利安說的,看門狗正在殺死你的應用程序。回答一些問題:

  • 爲什麼這隻發生在模擬器上? 因爲當你在調試時,看門狗會讓你的應用程序獨立運行,這可能需要一段時間。
  • 爲什麼只有當用戶輸入錯誤的URL時纔會發生這種情況? 由於系統超時,如果系統找不到服務器,系統將繼續嘗試60秒。
  • 所以問題是同步還是異步? 不,問題在於線程,您可以在後臺線程中執行相同的操作,只是不要在主線程中執行此操作,並且看門狗會讓您獨自一人。
  • 爲什麼當應用程序出現時屏幕變黑? 記住,你這是在主線程阻塞的東西,繪製線程...

希望那是全部。讓我知道如果我錯過了什麼。

0

使用ASIHttpRequest類,而不是NSURLConnection的,它只是包裝圍繞NSURLConnection的,具有非常簡單的回調,也可以設置時間來完成一個請求。請通過此鏈接瞭解更多信息http://allseeing-i.com/ASIHTTPRequest/

+0

NSURLConnection對我來說工作正常,只有在上述情況下才會崩潰。 – JiteshW

+0

ASIHttpRequest完全不使用NSURLConnection。 ASIHttpRequest也不再處於積極的發展中。 – hooleyhoop

-1

我認爲應用程序崩潰,因爲當用戶輸入錯誤URL你沒有得到任何數據,並且使用這個「返回」 nilNSData做的東西。

我認爲這將解決您的問題

NSData *data=[NSURLConnection sendSynchronousRequest:request 
            returningResponse:&response 
               error:&error]; 
if(data!=nil){ 
    /// 
} else { 
    NSLog(@"NO DATA"); 
} 
0

我覺得你首先要測試的用戶數據是否正確與否,並不僅僅是它是否正確,發送請求,否則提示用戶說:「請輸入正確的數據」 ...

當您的響應數據的分析失敗。您還可以創建協議委託方法,例如FinishWithError,以便您提出最後的UI。

0

試試這個:

#import "ASIHTTPRequest.h" 

//In a method 
[self performSelectorInBackground:@selector(DownLoadImageInBackground:) withObject:imgUrlArr]; 


-(void) DownLoadImageInBackground:(NSArray *)imgUrlArr1 
{ 
    NSURL * url = [Image URL]; 

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

-(void)requestFailed:(ASIHTTPRequest *)request 

{ 

    NSLog(@"URL Fail : %@",request.url); 

    NSError *error = [request error]; 

     // you can give here alert too.. 
} 

-(void)requestFinished:(ASIHTTPRequest *)request 

{ 

    NSData *responseData = [request responseData]; 
    UIImage *imgInBackground = [[UIImage alloc] 
         initWithData:responseData]; 
    [imageView setImage: imgInBackground]; 

} 

這可以幫助你:我也同時加載了一些圖片,因此,有沒有合適的數據圖像顯示黑屏。爲了避免這種情況,請嘗試調整您的imageview的大小。

0

您可以在開始請求之前檢查URL的可達性。 蘋果有Reachability這樣做的方法。但它更容易使用包裝。例如。 ASIReachability

3

,你應該看看這篇文章:https://developer.apple.com/library/ios/#qa/qa1693/_index.html

IOS包含看門狗,如果你的應用程序被阻止到多少時間的操作在主線程,這個人會被殺死。 (有關看門狗的詳細信息:http://en.wikipedia.org/wiki/Watchdog_timer

所以,如果你要下載的東西,不要下載它的主線程上。

+0

我不確定,但他沒有提及下載。主線程上的同步連接可能對登錄有意義可能 – suprandr

+1

我認爲在主線程上使用同步連接進行登錄操作不合理。最好不同步啓動它,顯示活動指示器並禁用用戶交互。我建議你創建一個包含具有完成處理程序塊的方法的登錄類。 (如果你想要一個例子,你可以看到iOs 5中可用的TWRequest類) – Julien

8

爲什麼不爲連接設置超時?

NSString *urlString = TEST_CONNECTION; 
NSError *error = nil; 
NSHTTPURLResponse *response = nil; 
NSURLRequest *request = [NSURLRequest 
         requestWithURL:[NSURL URLWithString:urlString] 
         cachePolicy:NSURLRequestReloadIgnoringCacheData 
         timeoutInterval:5.0]; 


NSData *conn = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

這應該秒數,這應該解決您的問題,而與異步調用去(有時是不正確的解決方案)

後釋放同步等待我知道這工作正常,因爲這是我如何檢查我是否連接到某個VPN(可達標誌完全失敗)。

2

RELATE

UIImage *image = [self.imgCache objectForKey:urlString]; 
if(!image){ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0]; 


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSURLResponse *response = nil; 
     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 
     NSLog(@"%@",response); 
     UIImage *img = [UIImage imageWithData:data]; 
     // 

     if(img) 
     { 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [self.imgCache setObject:img forKey:urlString]; 
       completionBlock(img); 
      }); 
     } 
    }); 

} 
else{ 
    completionBlock(image); 
} 
相關問題