エラーが発生したことを示すために、エラーが非 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