2011-11-02 23 views
6

私はsendSynchronousRequestを使用してサーバーからデータを取得しています。同期は、その要求に対してデータが受信されるまで待機することがわかります。NSURLConnection sendSynchronousRequest - バックグラウンドからバックグラウンド

しかし、間違ってユーザーがいくつかの存在しないURLを入力し、応答を得ようとするときに問題が発生します。この場合、ユーザーがバックグラウンドに入り、フォアグラウンドに入るよりも黒い画面しか表示されません。ステータスバーのみを表示します。また、その背景のアプリケーションを示していない。私は自分のアプリケーションから出るためにホームボタンを押す必要があります。

シミュレータでは、1分後に「Request time out」(クラッシュしない)というメッセージが表示されます。

デバイスでは、1分以内にアプリケーションがクラッシュします。

提案があります。ヘルプ。これは私のアプリでは本当に深刻な問題です。

ありがとうございました。

+0

あなたがクラッシュする前に、コンソールで何かを得ている関連しています。 – iamsult

+0

いくつかのクラッシュログを投稿してください。 – HelmiB

答えて

14

Julienが言ったように、ウォッチドッグがあなたのアプリを殺しています。いくつかの質問に答えるには

  • これはなぜシミュレータ上でのみ起こりますか? ウォッチドッグをデバッグするときは、アプリだけを残すため、時間がかかることがあります。
  • これは、ユーザーが間違ったURLを入力した場合にのみ発生します。 システムがタイムアウトしているため、サーバーが見つからない場合、システムは60秒間試行し続けます。
  • 問題は同期と非同期のどちらですか? いいえ、問題はスレッドです。バックグラウンドスレッドで同じ操作を実行できます。メインスレッドでは実行しないでください。ウォッチドッグはあなただけのままにします。
  • なぜアプリケーションが起動すると画面が黒くなりますか? メインスレッド、スレッドをブロックしていることを忘れないでください。

私が何かを見逃したら私に知らせてください。

0

は、NSURLConnectionの代わりにASIHttpRequestクラスを使用します.NSURLConnectionをラップするだけで、非常に単純なコールバックを持ちます。リクエストを完了するための時間を設定することもできます。私は、ユーザーが間違ったURLに入ったときに、あなたが任意のデータを取得していないため、アプリケーションがクラッシュして、あなたがこれを使用していると思うの詳細情報http://allseeing-i.com/ASIHTTPRequest/

+0

NSURLConnectionは私のために正しく動作していますが、上のケースではクラッシュしています。 – JiteshW

+0

ASIHttpRequestはNSURLConnectionをまったく使用しません。また、ASIHttpRequestはもはや積極的に開発されていません。 – hooleyhoop

-1

のために、このリンクを経由してください詰め込むを行うにはnilNSData「を返さ」。

私はこれがあなたの問題が解決すると思います、私はそれがしてください正しいかではないとだけ、それが正しいかどうかよりも、「その要求にそうでない場合は、プロンプトをユーザーに送信するかどうかを最初にユーザーデータをテストするために持っていると思う

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

応答内のデータのあなたの解析が失敗したときに正しいデータ」...

または

を入力してください。最後のUIが表示されるように、プロトコルデリゲートメソッド、つまりFinishWithErrorを作成することもできます。

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]; 

} 

これはあなたを助けるかもしれない:何の適切なデータを持っていない画像が黒い画面を表示するので、私はまた、一度に画像の数をロードしています。これを避けるには、イメージビューのサイズを変更してみてください。

0

リクエストを開始する前に、URLの到達可能性をチェックできます。 アップルはReachabilityそうする方法があります。しかし、ラッパーを使う方が簡単です。例えば。 ASIReachability。あなたはこの記事に見てみる必要があります

3

https://developer.apple.com/library/ios/#qa/qa1693/_index.html

IOSはウォッチドッグが含まれているアプリケーションは、メインスレッド上の操作に多くの時間にブロックされている場合は、この1は殺されます。 (ウォッチドッグについての詳細は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

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); 
} 
関連する問題