20


11

NSURLConnection sendSynchronousRequestによるエラー処理

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

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

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

2 Answer


55


エラーが発生したことを示すために、nil以外のエラーに依存しません。

私はBenの答えに記載されているエラーチェックを使用していますが、状況によっては偽陽性/スプリアスエラーを生成していると思います。

このhttps://stackoverflow.com/questions/1808929/handling-nserror-when-reading-from-file/1810301#1810301[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


30


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

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

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

if (error) {...handle the error}