我目前正在努力解释为什么以下代码不会记录我使用过的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;
}
如果我尝试在失败块内记录域名,我会得到正确的域名。但是在范围之外,块变量未被修改。对我理解错误的答案暗示了赞赏。
答案 0 :(得分:2)
问题是在你的`login之后很久就会调用success
和failure
块:withPassword:error:方法已经完成并返回,因为操作是在后台完成的。
当达到NSLog语句时,操作尚未完成,并且尚未执行任何块。因此localerror
仍然是nil
而success
仍然是NO。
答案 1 :(得分:0)
调用out of block的NSLog域将被更早调用,因为它将在主线程上,并且NSLog在新线程中发生故障阻止,并在服务器响应之后。因此,返回成功也不会设置成功(在您的情况下为否)。