2013-04-03 58 views
2

我的代码低于使一个URL所涉及的连接,并获取像HTTP代码响应和最终URL有些报头的响应(用于重定向的情况下):返回一个变量值的块之外 - 的Objective-C,的iOS


- (NSString *)test 
{ 
    __block NSString *cod = @"x"; 
    NSString *urlString = @" http://www.google.com "; 
    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; } 

正如所看到的,我已宣布鳕变量作为__block类型和x值设定。 里面的块,我已经设置了鳕鱼的y值,但在方法结束时,我得到了鳕鱼的x值。 我试过使用类似cod = code的东西,然后返回鳕鱼,尊重对象类型,但是我在块内部分配的任何东西,我无法获得它之外的值。 我在做什么错?

+0

备注:1.这与Xcode无关,它只是一个API和/或语言问题。 2.该语言称为Objective-C,不是客观的c,操作系统是iOS,而不是ios。 – 2013-04-03 20:51:25

回答

4

看看方法名称:

[NSURLConnection sendAsynchronousRequest:... 

哎呦!所以它是异步的。在完成块被调用时,您的test方法已经返回。您不能从同步方法返回异步调用的结果,因为它没有任何意义。使你的课程适应网络操作的异步性质,使用回调,委托等。总而言之,重新设计你的代码。

+0

嗯。说得通。如果我使用同步请求,我可以调整然后使用这个结构? 感谢您的评论。 ;) – thiagomorales 2013-04-03 20:55:00

+0

@ user2242117不,不幸的是,如果链中有一个单独的异步调用,其他所有其他调用也需要异步。 – 2013-04-03 20:56:13

+0

对!我将调整代码并再次尝试。 谢谢! – thiagomorales 2013-04-03 20:58:22