0

現在、次のコードが使用済みの NSString をログに記録しない理由に苦労しています。

-(BOOL)login:(NSString *)email withPassword:(NSString *)password error:(NSError *__autoreleasing *)error
{

__block BOOL success = NO;

if (*error)
    return success;

__block NSString *domain = @"de.FranzBusch.Searchlight.ErrorDomain";
__block NSError *localerror = nil;

//HTTP Request
NSURL *url = [NSURL URLWithString:@"Wrong URL to test the failure block"];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        email, @"email",
                        password, @"password", nil];

NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"" parameters:params];
AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument)
{
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *HTTPError, DDXMLDocument *XMLDocument)
{
    localerror = [NSError errorWithDomain:domain code:-101 userInfo:[self generateErrorDictionary:@"HTTPError"]];
    success = NO;
}];
[operation start];

NSLog(@"test %@", [localerror domain]);
return success;
}

失敗ブロック内のドメインをログに記録しようとすると、正しいものが得られます。ただし、スコープ外では、ブロック変数は変更されません。私が間違って理解したことについてのヒントをいただければ幸いです。

4

2 に答える 2

2

問題は、操作がバックグラウンドで行われるため、 `login:withPassword:error: メソッドが完了して戻ってきた後、 successandブロックが呼び出されることです。failure

NSLog ステートメントに達したとき、操作はまだ終了しておらず、どちらのブロックもまだ実行されていません。今でもそうlocalerrorですnilし、今successでもNOです。

于 2012-11-07T21:45:00.983 に答える
0

ブロック外で呼び出された NSLog ドメインは、メイン スレッド上にあるため、以前に呼び出されます。NSLog は、新しいスレッドで障害ブロックが発生し、サーバーからの応答の後に呼び出されます。したがって、成功を返すと、設定されていない成功も返されます(あなたの場合はいいえ)。

于 2012-11-07T21:46:04.677 に答える