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を使用していると言いました。
どのように、どこで、あなたの問題を解決する必要があり
_responseDataが宣言されていますか?また、NULLの代わりにif(_responseData == nil)をチェックする必要があります。 –