0

私が Objective C の初心者であることをここに示します。これら 2 つのメソッドの 2 番目は、上記のメソッドによって呼び出されます。全然わからないけどどこ?2 番目のメソッドを呼び出す部分を if ステートメントでラップして、返されたブール値に基づいてファイルが存在するかどうかを判断できるようにしたいと考えています。誰かがこの2番目のメソッドがどのように呼び出されるかを説明することもできれば、サンプルコードをいただければ幸いです。

-(void) queryResponseForURL:(NSURL *)inURL {
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:inURL];
    [request setHTTPMethod:@"HEAD"];
    NSURLConnection * connection = [NSURLConnection connectionWithRequest:request delegate:self];
    // connection starts automatically
}

-(BOOL)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    if([(NSHTTPURLResponse *)response statusCode] == 200){
        NSLog(@"file exists");
        return YES;
    }else return NO;
}
4

2 に答える 2

2

2番目のメソッドは、デリゲートメソッドまたはコールバックメソッドです。コールバックメソッドは、接続インスタンスが接続先のサーバーから応答を受信したときに呼び出されます。NSURLConnectionには、NSObjectに関するいくつかの非公式プロトコルがあります。これは、NSObjectのサブクラスがこれらのメソッドを実装すると、これらのプロトコルで定義されたメソッドが自動的に呼び出されることを意味します。NSObjectのサブクラスはこれらのコールバックメソッドの1つを実装しているため、このメソッドが呼び出されます。ほとんどのデリゲートは正式なプロトコルとして宣言されており、それらを使用するには、クラスで明示的に定義する必要があります。NSURLConnectionの非公式プロトコルはルールの例外ですが、これはiOSの将来のバージョンで変更されようとしています。

PS:Objective-Cのプロトコルは、基本的にJava / C#のインターフェースと同じです。

詳細はこちら:http ://developer.apple.com/library/ios/ipad/#documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html


間違った応答を受け取ったときに接続をキャンセルしたいと思いますか?あなたがすべきことは次のとおりです。

  1. URLConnectionをivarまたはプロパティに保存します(個人的にはプロパティが望ましいです)。
  2. デリゲートメソッドで、-connection:didReceiveResponse応答ステータスコードが適切な値でない場合は、接続をキャンセルします。この目的のためにivarまたはプロパティを使用できます。
于 2013-02-05T13:07:25.590 に答える
2

NSURLConnection オブジェクトによって呼び出されるため、それを呼び出すコードに介入することはできません。しかし、そうする必要はありません。デリゲート メソッドの目的は、アクセスできないコードにフックできるようにすることです。

ちなみに、メソッドのシグネチャは次のとおりです。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

これには戻り値がなく、NSURLConnection オブジェクトのプロトコルの一部であるため、メソッドの署名を変更することはできません。このメソッドを呼び出すのではなく、接続オブジェクトが呼び出すことに注意してください。ただし、メソッドに応答することはできます。BOOL を返そうとする代わりに、このメソッド内で「if file..」コードを処理するか、そこから別のメソッドを呼び出すことができます。これは、応答が開始されたことが確認されたときに (非同期に) トリガーされることに注意してください。つまり、MIME タイプなどの HTTP ヘッダー情報を確認できますが、データ転送の完了は保証されません (他のデリゲート メソッドがあります)。そのために)。

NSURLConnectionの開発者ガイドも参照してください。

于 2013-02-05T13:47:35.870 に答える