2

他のクラスのすべての HTTP 接続作業を処理するクラスを作成したい (コードを繰り返し書くのを避けるため)。これを ConnectionCenter (NSObject のサブクラス) と呼び、次のコードを追加します。

-(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」は呼び出されません。何が問題なのかについてのアイデアはありますか?

4

2 に答える 2

2

はデリゲート メソッドである[theConnection setDelegate:self]ため、接続をセットアップした後に呼び出す必要があります。connection:didReceiveData:

詳細については、ドキュメントを参照してください。

于 2009-03-10T03:02:54.553 に答える
0

このコードに関するいくつかのこと...

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

データを受信して​​いない場合は、接続に失敗したか、データを返さずに接続が完了した可能性があります。connectionDidFinishLoading:およびconnection:didFailWithError:デリゲートメソッドを実装して、データを返すかどうかに関係なく、接続が終了したかどうかを確認する必要があります。

最後に、良好で高速な接続が得られれば、競合状態に陥ります。NSURLConnectionオブジェクトは、作成するとすぐに実行を開始します。読み取るデータがある場合は、connection:didReceiveData:を呼び出し、それをreceivedDataに追加します。ただし、接続が十分に高速である場合は、まだ作成されていないreceivedDataにデータを追加しようとする可能性があります。小さなチャンスですが、NSURLConnectionのinitメソッドがブロックしない場合でも、接続を確立するためにどの程度の作業を行ってから戻るかについて推測するのは賢明ではありません。接続を開始する前にreceivedDataを作成して、データが受信されたときにデータを配置できる場所を確保できるようにします。

于 2009-03-10T15:59:00.193 に答える