objective c __block变量

时间:2012-11-07 21:35:20

标签: objective-c objective-c-blocks

我目前正在努力解释为什么以下代码不会记录我使用过的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;
}

如果我尝试在失败块内记录域名,我会得到正确的域名。但是在范围之外,块变量未被修改。对我理解错误的答案暗示了赞赏。

2 个答案:

答案 0 :(得分:2)

问题是在你的`login之后很久就会调用successfailure块:withPassword:error:方法已经完成并返回,因为操作是在后台完成的。

当达到NSLog语句时,操作尚未完成,并且尚未执行任何块。因此localerror仍然是nilsuccess仍然是NO。

答案 1 :(得分:0)

调用out of block的NSLog域将被更早调用,因为它将在主线程上,并且NSLog在新线程中发生故障阻止,并在服务器响应之后。因此,返回成功也不会设置成功(在您的情况下为否)。