web-dev-qa-db-ja.com

NSURLConnection sendSynchronousRequestによるエラー処理

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

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

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

19
Nnp

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

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

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

if (error) {...handle the error}
29
Ben Gottlieb

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

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

このように SO回答 、私はメソッドの結果を使用して成功/失敗を判断するように変更しています。そして(そしてそのときだけ)失敗の詳細についてエラーポインターを確認します。

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
55
ohhorob