2012-05-01 15 views
4

代理人にconnection:didFailWithError:メッセージを受信させるには、Webサービスは何をする必要がありますか?NSURLConnectionの接続を介してwebserviceにエラーを送信する方法:didFailWithError :?

例: iOSアプリケーションはトークンをWebサービスに渡し、Webサービスはトークンを検索し、Webサービスは「無効なトークン」などのエラーで応答する必要があります。

現在、データが受信され、エラーメッセージとして "connectionDidFinishLoading:"が解析されます。これは、私が避けようとしている2か所でのエラーチェックです。

iOSアプリとウェブサービスの両方が完全に私のコントロール下にあります。

答えて

5

-connection:didFailWithError:は、HTTP交換が失敗した場合にのみ呼び出されます(プログラミングで最も危険な3つの単語)。これは通常、ネットワークエラーまたは認証エラー(私は認証を使用しない)です。 HTTPメッセージが成功すると、応答コードに関係なく、-connectionDidFinishLoading:が呼び出されます。

私の解決策:エラーが検出されたときに-connection:didFailWithError:に電話してください。そうすれば、エラー処理コードはすべて1か所に収まります。私-connectionDidFinishLoading:の上部に

は、私が持っている:

NSError *error; 
NSDictionary *result = [self parseResultWithData:self.connectionData error:&error]; 
if (!result) { 
    [self connection:connection didFailWithError:error]; 
    return; 
} 
+0

あなたのコメントの 'connectionDidFinishLoading'の最初の言及は' -connection:didFailWithError: 'でしょうか? – pre

+0

おっと...訂正していただきありがとうございます。私は私の答えでそれを修正した。 –

+0

私がこれを考えるほど、ジェフリーは、あなたがおそらく最も答えが正しいと思います(しかし、決定的な参照点は望めます)。デリゲートのコールバックは* connection:* didFailWithError:not webService:didFailWithError: – edelaney05

0

を直接あなたの質問に関連していないが、私はより高いレベルのライブラリに移動することをお勧めします。私はAFNetworkingを心からお勧めします。それは生産準備ができており、私は多くのプロジェクトでそれを使用しています。これにより、障害ブロック内の各要求の応答コードを検査できます。また、このプロジェクトでは、ネットワーク通信のために書く必要がある低レベルの処理を抽象化しています。ここでは、サービスと通信するためのXML/JSON文字列の解析と作成について説明します。

あなたがあなたの質問にもっと集中的に答えるために、connectionDidFinishLoading:でエラーに気付いたら、NSURLConnectionのcancelメソッドを呼び出します。これにより、要求が自動的にキャンセルされ、デリゲートオブジェクトの失敗メソッドが呼び出されます。

NSURLConnectionのドキュメントはかなり乾燥しており、デリゲートの失敗メソッドは特に失敗のケースを文書化していません。 URL Loading System Programming Guideに詳しい情報があります。

+0

'-cancel'の呼び出しに関する興味深い提案。ドキュメンテーションによると、 'このメソッドが呼び出された後、接続のデリゲートは接続のメッセージを受け取らなくなりました。' '実際のアプリケーションは別の結果を出すかもしれませんが、' 'connection:didFailWithError: 'は呼び出されません。 – edelaney05

1

NSUrlConnectionの委任された接続:didFailWithError:が呼び出すことができる条件はたくさんあります。ここにはerrors or constantsのリストがあります.Connection:didFailWithError:のalertエラーを表示する方がよいでしょう。

-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error 
{ 
UIAlertView *errorAlert= [[UIAlertView alloc] initWithTitle: [error localizedDescription] message: [error localizedFailureReason] delegate:nil     cancelButtonTitle:@"Done" otherButtonTitles:nil]; 
[errorAlert show]; 
[errorAlert release];  
NSLog (@"Connection Failed"); 
} 
+0

ありがとうございます。しかし、私のコントロール下にあるWebサービスがdidFailWithError:delegateコールバックを引き起こすためには、何が必要なのでしょうか。 – edelaney05

0

私は木のforrestを見ることができませんでした。

私はconnection:didFailWithError:から戻って、別のデリゲートメソッドconnection:didReceiveResponse:を見る必要がありました!

Webサービスを完全に制御すると、エンドポイントはconnection:didReceiveResponseで取得される500のステータスコードで応答し、さらに状況を説明するJSONを渡して、connection:didReceiveData:で処理されます。

NSURLConnectionデリゲートは、プロセス全体を通じてさらに2ビットの状態にハングアップしますが、これまでに見た中で最も優れたコードの匂いがあります。

Jeffery's answerconnection:didFailWithError:コールバックはネットワークに関係なく失敗しました。ウェブサービスからの応答は接続が失敗しなかったことを意味します。

関連する問題