使用sendAsynchronousRequest执行代码

时间:2014-06-17 15:33:07

标签: objective-c json asynchronous

由于(null)在请求完成之前未完成,因此变量设置为sendAsynchronousRequest。见代码:

main.m

GlobalSettings *globalsettings = [[GlobalSettings alloc] init];
NSString *url = [globalsettings facebookLink];
NSLog(@"URL: %@", url);

所以,在GlobalSettings内:

-(NSString *)facebookLink
{
__block NSString *strReturn;

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://urlEditedOut/"]];

__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                           json = [NSJSONSerialization JSONObjectWithData:data
                                                                  options:0
                                                                    error:nil];
                           strReturn = json[@"FB"];
                       }];
return strReturn;
}

所以这个工作正常,已经在completion块内进行了测试。然而,回到main.m,由于(我假设)异步请求仍然连接/处理请求,变量url被设置为(null)

你如何解决这个问题,以便将变量保存为正确的值?

1 个答案:

答案 0 :(得分:0)

url设置为null,因为该方法由于异步请求而立即返回。避免这种情况的方法是委托。使main成为GobalSettings的委托,并从完成块调用委托方法。这个SO-Post不是一个完全重复,但它足够接近让你开始。 How to return the ouput if method is using NSURLConnection Asynchronous calls with blocks

Avt的答案就是我所建议的,但是返回一个块也有效。