9

私のアプリのすべてのサーバー接続は同じように進みます:

  • 2 番目のスレッドへの dispatch_async。
  • sendSynchronousRequest
  • メインスレッドの失敗/成功ブロック。

  • 以下は完全なコードではなく、概念のみです。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *url = [NSURL URLWithString:@"someURL"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSURLResponse *response = nil;
        NSError *error;
        NSData *data = [NSURLConnection sendSynchronousRequest:request
                                                 returningResponse:&response
                                                             error:&error];
       if (error)
       {
          dispatch_async(dispatch_get_main_queue(), ^{ _failureBlock(error); });
       }
       else
       {
          dispatch_async(dispatch_get_main_queue(), ^{ _successBlock(data); });
       });
    

さて、アプリはうまく機能します!何千ものサーバー接続に使用でき、アプリの新しいロードを実行すると常に機能します。この問題は、次の場合に発生します。

  1. アプリを BG に送信します。
  2. しばらくお待ちください...
  3. アプリは iOS によって強制終了されます。
  4. もう一度開くと、iOS はアプリ全体を最初から読み込みます。(スプラッシュ画面に続いて最初の画面を参照してください。私が BG に残した画面ではありません..)

そのシナリオでは、NSURLConnectionErrors が発生します!! それらのすべての種類!Code 1003、Code 1009、Code 9...名前を付けてください。アプリのロード直後に開始されるすべてのサーバー接続でエラーが発生します。その後の他の接続は正常に機能します。失敗したもののリフレッシュも含めて!

サーバーに到達しようとしているのが速すぎる、または早すぎるように感じますが接続を開始する前に到達可能性テストを確認して合格します。

ここで本当に助けが必要です。 前もって感謝します。

更新: 以下で提案されているように、sendAsynchronousRequestを使用しようとしました - まったく同じ動作が得られました。(エラー: 今回は 1001)。

4

2 に答える 2

4

はい、わかった!appDelegate は、いくつかの NSURLConnections を送信したすべての viewController をロードした tabBar を構築しました...そのため、iOS では、応答を待つには長すぎると考え、すべて失敗しました! (最初の起動が問題ない方法はわかりません。アプリが強制終了された後でなければなりません)

とにかく、 すべてのサーバーの負荷をセレクターで 0.1 遅延で実行するように変更しました。そうすれば、appDelegate の実行が完了し、すべて問題ありません。:)

于 2012-12-26T17:01:15.640 に答える
3

このメソッドの使用を検討し、データを非同期的に送信する必要があります

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

NSOpertationQueue mainQueue はメイン スレッドを使用しますが、メイン スレッド、つまりアクティビティ インジケーターなどでも UI を更新できます。

于 2012-12-24T00:39:46.420 に答える