2012-01-24 7 views
0

NSURLConnectionラッパーを実装する際に問題があります。私は、POSTデータとNSURLConnectionを作成していると、接続だけでなく、データを受信するように見えます。 didReceiveDataコールバックはresponseDataの長さを記録します。これは2000バイトです。ただし、didFinishLoadingが発生するまでにresponseDataには0バイトが含まれます。 responseDataの内容を変更する可能性がある場所を探すヒントはありますか? didReceiveResponseでリセットされますが、didReceiveDataとdidFinishLoadingの間でdidReceiveResponseは呼び出されません。ここで NSURLConnectionラッパーのresponseDataを失う

は、ログからいくつかの出力です:

現在の言語:自動;現在のobjective-c 2012-01-24 13:35:40.020 PSIdea [24007:11903] didReceiveResponse:レスポンスデータ長:(0)
警告:フレームにないブロック でUSE_BLOCK_IN_FRAME変数を作成しようとしています。 2012-01-24 13:35:40.604 PSIdea [24007:11903] didReceiveData。レスポンスデータ長:(2233)2012-01-24 13:35:40.604 PSIdea [24007:11903] didFinishLoading:レスポンスデータ長:(0)
2012-01-24 13:35:41.881 PSIdea [24007:11903] responseData PSIdea 41.882 [24007:11903] responseData 辞書として:
2012-01-24 13:35文字列として

ここでは、関連するコードである:

NetworkController.m

-(void)postRequestToURL:(NSURL*)url withData:(NSData*)data withContentType:(NSString*)contentType 
{ 
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    if (!contentType) 
    { 
     contentType = @"application/x-www-form-urlencoded"; 
    } 
    [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:data]; 
    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

-(void)connection:(NSConnection*)conn didReceiveData:(NSData*)data 
{ 
    [_responseData appendData:data]; 
    NSLog(@"didReceiveData. responseData length:(%d)", _responseData.length); 
} 

-(void)connection:(NSConnection*)conn didReceiveResponse:(NSURLResponse *)response 
{ 
    if (_responseData == NULL) { 
     _responseData = [[NSMutableData alloc] init]; 
    } 
    [_responseData setLength:0]; 
    NSLog(@"didReceiveResponse: responseData length:(%d)", _responseData.length); 
} 


-(void)connection:(NSConnection*)conn didFailWithError:(NSError *)error 
{ 
    NSLog([NSString stringWithFormat:@"Connection failed: %@", error.description]); 
} 

PSINetworkController.m(サブクラス)

-(void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    NSLog(@"didFinishLoading: responseData length:(%d)", _responseData.length); 
    NSString *responseString = [[NSString alloc] initWithData:_responseData encoding:NSUTF8StringEncoding]; 
    NSLog(@"responseData as string: %@", responseString); 
    SBJsonParser* parser = [[SBJsonParser alloc] init]; 
    NSDictionary* dict = [parser objectWithData:_responseData]; 
    NSLog(@"responseData as dictionary:"); 
    for (id key in dict) { 
     NSLog(@"%@=%@", key, [dict objectForKey:key]); 
    } 
    [_delegate connection:connection receivedResponse:dict]; 
} 

ありがとうございました。

編集: また、私は解決策を見つけたようです。問題は、_responseDataが宣言される方法と関係があります。

アトミックなプロパティとして応答データを宣言すると、以前のように応答データがリセットされます。

@property (retain) NSMutableData* responseData; 

しかし、単にインタフェースで変数を宣言すると、問題が解消すると思われる - データがdidReceiveDataからdidFinishLoadingに持続します。

プロパティを宣言するだけでセッターとゲッターが生成されると私は理解していますが、この状況ではどのように関係しているのでしょうか。誰でも説明できますか?

編集:私はこのプロジェクトがARCを使用していると言いました。

+0

どのように、どこで、あなたの問題を解決する必要があり

-(void)connection:(NSConnection*)conn didReceiveResponse:(NSURLResponse *)response { if (self._responseData) { self._responseData = [[NSMutableData alloc] init] autorelease]; } //further code } 

_responseDataが宣言されていますか?また、NULLの代わりにif(_responseData == nil)をチェックする必要があります。 –

答えて

0

あなたの.hファイルならば維持するとして、あなたはにコードを変更する必要がありresponseDataを宣言している場合:これは

+0

これはARCを使用していることを忘れました。 – tronbabylove

関連する問題