2013-04-03 59 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