3

Apple のドキュメントのコードを使用して、HTTP 通信を行っています。URL には正常に接続できますが、サーバーからデータを受信できませんでした。

// create the request
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                        timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData that will hold
    // the received data
    // receivedData is declared as a method instance elsewhere
    NSMutableData *receivedData=[[NSMutableData data] retain];
} else {
    // inform the user that the download could not be made
}

理由は次のとおりです。

  1. receivedData私はアクション自体で宣言します。注釈には、別の場所で宣言する必要があると書かれています。どこに申告すればいいですか?コントローラーのプロパティとして宣言する必要がありますか?

  2. [[NSMutableData data] retain]の外部にあるため、URL をどのように見つけることができますif{}か?

4

1 に答える 1

5

NSURLConnection の initWithRequest:delegate: メソッドを使用すると、一連のメソッド呼び出しでデータが (その他のものと共に) デリゲート オブジェクトに送信されます。メソッドはすべてオプションであるため、デリゲート オブジェクトがそれらを実装していない場合、接続オブジェクトはそれらをスキップします。

多数のメソッドがあるため、ここではすべてをリストしませんが、NSURLConnection のドキュメントで詳細に説明されています。受信したデータを取得するには、デリゲート オブジェクトに -connection:didReceiveData: を実装します。このメソッドは、新しく受信したデータを表す NSData オブジェクトを使用して、複数回呼び出される可能性があります。次に、それを既存の NSMutableData オブジェクトに追加するか、その他の意味のあることを行うことができます。デリゲート オブジェクトで -connectionDidFinishLoading: が呼び出されると、すべてのデータを受信したことがわかります。

あなたの2つの特定の質問に答えるには:

  1. はい、コントローラー オブジェクトのプロパティとして宣言する必要があります。また、接続オブジェクトが作成されるとすぐに接続がデータの非同期ロードを開始するため、NSURLConnection の initWithRequest:delegate: を呼び出す前にオブジェクトを割り当てる必要があります。または、デリゲートに -connection:didReceiveResponse: を実装し、HTTP ステータスを確認してからデータ オブジェクトを作成することもできます。

  2. 変更可能なデータ オブジェクトは、設定したとおりに URL、接続、またはそのデータを見つけることができませんが、私が説明した手順に従えば、入ってくるデータをそれに追加し、使用することができます。接続が終了したとき。

于 2009-02-27T04:48:21.367 に答える