19

NSURLConnection sendSynchronousRequest でエラー処理を改善するにはどうすればよいですか? 私が実装できる方法はありますか

- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error

バックグラウンドでデータを取得している nsoperation キューがあるため、同期要求があります。非同期リクエストを実装する必要がある場合、リクエストが完了するのを待つにはどうすればよいですか。そのメソッドはデータなしでは続行できないためです。

4

2 に答える 2

55

エラーが発生したことを示すために、エラーが非 nil であることに依存しません。

ベンの回答で説明されているようにエラーチェックを使用していますが、状況によっては誤検知/偽のエラーが発生していると思います。

this SO answerに従って、メソッドの結果を使用して成功/失敗を判断するように変更しています。そして、(そしてその時だけ) エラー ポインターをチェックして、失敗の詳細を確認します。

NSError *requestError;
NSURLResponse *urlResponse = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
/* Return Value
   The downloaded data for the URL request. Returns nil if a connection could not be created or if the download fails.
*/
if (response == nil) {
    // Check for problems
    if (requestError != nil) {
        ...
    }
}
else {
    // Data was received.. continue processing
}

このアプローチにより、ダウンロード プロセスで発生した、失敗の原因ではないエラーへの対応を回避できます。ダウンロードが発生すると、フレームワーク内で処理される重大ではないエラーが発生する可能性があり、エラーオブジェクトでエラーポインターを設定するという副作用がある可能性があると思います。

たとえば、アプリをダウンロードしたユーザーから、URL 接続の処理の奥深くで発生したと思われる POSIX エラーが報告されています。

このコードは、エラーを報告するために使用されます。

NSString *errorIdentifier = [NSString stringWithFormat:@"(%@)[%d]",requestError.domain,requestError.code];
[FlurryAPI logError:errorIdentifier message:[requestError localizedDescription] exception:nil];

エラーは次のように報告されます。

Platform: iPhone
Error ID: (NSPOSIXErrorDomain)[22]
Msg: Operation could not be completed. Invalid argument

その背中をマッピング..

requestError.domain = NSPOSIXErrorDomain
requestError.code = 22
[requestError localizedDescription] = Operation could not be completed. Invalid argument

私が掘り下げることができたのは、エラーコード 22 がEINVALであるということだけですが、それ以上の詳細は得られていません。

私が受け取る他のエラーは、さまざまなネットワーク条件下で完全に予想される NSURL ドメインからのものです。

NSURLErrorTimedOut
NSURLErrorCannotConnectToHost
NSURLErrorNetworkConnectionLost
NSURLErrorNotConnectedToInternet
+others
于 2010-03-24T20:30:04.003 に答える
29

-sendSynchronousRequest:returningResponse:error: メソッド自体でエラーを取得する方法を提供します。最後の引数は実際には (NSError **) エラーです。つまり、NSError ポインターへのポインターです。これを試して:

NSError        *error = nil;
NSURLResponse  *response = nil;

[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error];

if (error) {...handle the error}
于 2010-01-15T02:27:47.573 に答える