1

ある種のエラー処理を iOS アプリに取り入れようとしています。try/catch ブロックはあまり良い方法ではないことを読んだ後、NSURLConnection の &error 出力パラメーターを見ています。私は NSError への参照を渡そうとしていますが、チェーンを介してそれを渡し続けています。

最初の関数は、DAL のメソッドを呼び出します。

NSError *error = nil;
SearchResult *res = [db getHereditaments:&error];
if (error) {
    [self performSelectorOnMainThread:@selector(DisplayError:) withObject:error waitUntilDone:NO];
    //todo: handle error
} else {
    [self performSelectorOnMainThread:@selector(DisplayResults:) withObject:res waitUntilDone:NO];
}

次に、2 番目のメソッド (呼び出される) がエラーを伝えようとします。これは、NSError が nil であるかどうかのチェックを追加するまで問題なく機能し、この場合はデータが返されるのに、なぜエラーも返されるのでしょうか?

呼び出されるメソッドは次のとおりです。

    -(SearchResult *) getData:(NSError**)error {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *userName  = [prefs stringForKey:UsernameKey];
NSString * password =  [prefs stringForKey:PasswordKey];

NSURL *url = [UrlUtility getSearchResults:userName passwordHash:password];
CXMLDocument *responseObj = [UrlUtility xmlDocWithUrl:url onError:&error];
if(error ==nil){// should be nil if the connection was successful shouldn't it?
4

1 に答える 1

2

まず、同じエラーをチェーンに渡す場合は、&*errorをメソッドに渡す必要があります。

次に、エラーポインタを処理する場合は、通常、エラーではなく*エラーを処理する必要があります。

そして第三に、エラー==nilかどうかを決してチェックしないでください。responseObj==nilかどうかを確認する必要があります。それが当てはまる場合はエラーを使用できますが、そうでない場合はエラーは発生しません。

最後に、主題に完全に関連しているわけではありませんが、開発者として役立つはずです。メソッド名の先頭に「get」を実際に使用するべきではありません。Getは、参照によってさまざまな値を返すためにのみ使用されますが、通常は避ける必要があります。メソッドは、おそらくdownloadSearchResultsWithError:およびURLForSearchResultsWithUsername:password:のようなものである必要があります。

于 2011-07-26T08:44:49.527 に答える