2009-03-10 7 views
2

コードを繰り返し書くことを避けるために、他のクラスのすべてのHTTP接続作業を処理するクラスを作成したいと思います。 私は(NSObjectのサブクラスの)ConnectionCenterそれを呼び出すと、それに次のコードを追加します。特別なクラスでHTTP接続を設定する方法は?

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect 
{ 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect]; 
    if (theConnection) 
    { 
     // receivedData is declared as a method instance elsewhere 
     receivedData = [[NSMutableData data] retain]; 
    } 
    else 
    { 
     // inform the user that the download could not be made 
    } 

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // append the new data to the receivedData 
    // receivedData is declared as a method instance elsewhere 
    [receivedData appendData:data]; 
} 

そして、他のクラスはURLとConnectionCenterのオブジェクトを渡すことによってそれを呼び出します。しかし、ConnectionCenterのメソッドdidReceiveDataは呼び出されません。何が問題なのか?

+1

なぜ接続しますか:メソッドは2番目の引数でConnectionCenterを受け入れますか?接続を開始する前にreceivedDataを作成します。これはConnectionCenterの方法ではありませんか?もしそうなら、それは通常の方法( '' self'')で自分自身を参照できるだけで、なぜオブジェクトをそれ自身に渡していますか? –

+0

通常の方法で「自己」が機能しないので、私はこの変更を行います。これがまだうまくいかなければ、私は元に戻ってきます。 –

+0

ありがとうございます。私はデリゲートを「自己」に戻し、それが機能します。 –

答えて

2

接続を設定した後でに電話する必要があります。これは、connection:didReceiveData:が代理人方式であるためです。

詳細についてはdocumentationをお読みください。

0

このコードに関する物事のカップル...

まず、それはあなたが実際にデリゲートとして設定しているどのオブジェクト紛らわしいです。 connection:didReceiveData:への呼び出しは、接続のデリゲートで呼び出されます。これは、あなたがconnect:obj:メソッドに渡したオブジェクトです。 ConnectionCenterにインスタンスメソッドがあり、デリゲートとして別のConnectionCenterオブジェクトとの接続を開始することができます。正しいオブジェクトの接続:didReceiveData:メソッドを確認してください。

データを受信して​​いない場合は、接続が失敗したか、データを返さずに完了した可能性があります。 connectionDidFinishLoading:とconnection:didFailWithError:delegateメソッドを実装して、接続が完了したかどうかを知るようにしてください。

最後に、良好で高速な接続が得られれば、あなたに噛み付く競争状態になります。 NSURLConnectionオブジェクトは、作成するとすぐに実行を開始します。読み込むデータがある場合は、connection:didReceiveData:を呼び出し、それをreceivedDataに追加します。しかし、接続が十分速ければ、まだ作成されていないreceivedDataにデータを追加しようとするかもしれません。小さなチャンスですが、NSURLConnectionのinitメソッドはブロックされませんが、戻ってくる前に接続を取得するためにどのくらいの作業が行われるかについては何の仮定もしていません。

+0

本当にありがとう。私はデリゲートを「自己」に変更して動作させます。前回接続エラーが発生した可能性があります。 –

関連する問題