3

以下のコードは、URL への接続であり、http コード応答や最終 URL (リダイレクトの場合) などのいくつかのヘッダー応答をフェッチします。


- (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; }

ご覧のとおり、cod 変数を__block型として宣言し、x 値を設定しました。ブロック内で cod に y 値を設定しましたが、メソッドの最後で cod の x 値を取得しました。私は cod = code のようなものを使用しようとしましたが、オブジェクトの型を尊重して cod を返しますが、ブロック内で割り当てたものはすべて、ブロック外の値を取得できません。私は何を間違っていますか?

4

1 に答える 1

4

メソッド名を見てください。

[NSURLConnection sendAsynchronousRequest:...

おっと!だから非同期です。完了ブロックが呼び出されるまでに、testメソッドはすでに返されています。意味がないため、同期メソッドから非同期呼び出しの結果を返すことはできません。クラスをネットワーク操作の非同期の性質に合わせて調整し、コールバック、委任などを使用します。全体として、コードを再設計します。

于 2013-04-03T20:48:46.220 に答える