【问题标题】:Returning a variable value outside a block - Objective-C, iOS返回块外的变量值 - Objective-C,iOS
【发布时间】:2013-04-03 20:42:48
【问题描述】:

我有下面的代码,它连接到一个 URL 并获取一些标头响应,例如 http 代码响应和最终 URL(用于重定向情况):


- (NSString *)test
{
    __block NSString *cod = @"x";
    NSString *urlString = @"@987654321@";
    NSURL *url = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                       timeoutInterval:15.0f];

[request setHTTPMethod:@"HEAD"];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                           NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
                           NSURL *resolvedURL = [httpResponse URL];
                           NSString *code = [NSString stringWithFormat:@"%ld", (long)[httpResponse statusCode]];
                           NSLog(@"%@", resolvedURL);
                           NSLog(@"%@", code);

                           cod = @"y"; // the idea was use something like 'cod = code', then return 'code' at end.. But it dont works too.
                       }];
return cod; }

正如所见,我已将 cod 变量声明为 __block 类型并设置为 x 值。 在块内,我已经为 cod 设置了 y 值,但在方法结束时,我得到了 cod 的 x 值。 我尝试使用 cod = code 之类的东西然后返回 cod,尊重对象类型,但是我在块内分配的任何东西,我都无法获得它之外的值。 我做错了什么?

【问题讨论】:

  • 备注:1.这与Xcode无关,而是API和/或语言问题。 2.语言叫Objective-C,不是Objective c,操作系统是iOS,不是ios。

标签: ios block


【解决方案1】:

看方法名:

[NSURLConnection sendAsynchronousRequest:...

哎呀!所以它是异步的。在调用完成块时,您的 test 方法将已经返回。您不能从同步方法返回异步调用的结果,因为它没有意义。调整您的类以与网络操作的异步性质保持一致,使用回调、委托等。总而言之,重新设计您的代码。

【讨论】:

  • 嗯。说得通。如果我使用同步请求,我可以调整然后使用这个结构吗?感谢您的意见。 ;)
  • @user2242117 不,不幸的是,如果链中只有一个异步调用,那么所有其他调用也需要异步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多