nSURLConnection sendSynchronousRequestでエラー処理を改善するにはどうすればよいですか?私が実装できる方法はありますか
- (void)connection:(NSURLConnection *)aConn didFailWithError:(NSError *)error
バックグラウンドでデータを取得しているnsoperationキューがあるので、同期要求があります。非同期リクエストを実装する必要がある場合、リクエストが完了するのをどのように待つことができますか?その方法はデータなしでは続行できないためです。
-sendSynchronousRequest:returningResponse:error:メソッド自体でエラーを取得する方法を提供します。その最後の引数は本当に(NSError **)エラーです。つまり、NSErrorポインタへのポインタです。これを試して:
NSError *error = nil;
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest: req returningResponse: &response error: &error];
if (error) {...handle the error}
エラーが発生したことを示すためにエラーが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