sendSynchronousRequest
のNSURLResponse
に変更が発生していないのに毎回情報を受け取らないのはなぜですか? NSData
が受信されているようですが、文字列に変換されず、次にjsonコール経由でNSArray
に変換されません。コードは以下の通りです。以下のコードはすべて単一の関数になっていますが、名前が必要であるとは思われません。NSURL応答が常にデータを受信していない
NSURL *searchURL = [NSURL URLWithString:@"website"];
NSString *searchedItem = searchFood.text;
NSString *post = [NSString stringWithFormat:@"a=ajax_food_search3&u_id=*******&value=%@", searchedItem];
NSData *pData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *pLength = [NSString stringWithFormat:@"%d", [pData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:searchURL];
[request setHTTPMethod:@"POST"];
[request setValue:pLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:pData];
//[request setTimeoutInterval:30];
NSURLResponse *response = nil;
NSError *err = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSString *sData = [NSString stringWithUTF8String:[data bytes]];
NSArray *jsonFoodArr = [sData objectFromJSONString];
if(jsonFoodArr != nil){
NSDictionary *jsonDic = [jsonFoodArr objectAtIndex: 0];
NSDictionary *jsonDat = [jsonDic objectForKey:@"dat"];
NSArray *jsonFoodList = [jsonDat objectForKey:@"file"];
for (int i = 0; i < [jsonFoodList count]; i++) {
NSDictionary *fill = [jsonFoodList objectAtIndex:i];
NSDictionary *foodDat = [fill objectForKey:@"fdat"];
[foodResults addObject:[foodDat objectForKey:@"f_name"]];
}
NSLog(@"%@\n", foodResults);
}else {
NSLog(@"Failed to read information");
}
私はそれが動作するとき、接続が失敗しただけでなく、ときに私NSData
オブジェクトが私に同じバイトを与えることを追加したいです。彼らが同じメモリアドレスを使用しているのかどうかは分かりませんが、私はアプリを再起動したときにコンピュータが幸運になる方法はないとは思わないでしょう。どちらの方法でもエラーは発生しません。応答を受け取り、何らかのデータを受け取っていますが、NSString
は毎回それを変換していないため、jsonはゼロではありません。
サーバーに1000回の呼び出しを行った後に、接続に接続されている文字列がNSString
に変換されたことが原因で、このエラーが発生したことが判明しました。
[
{
"cmd": null,
"dat": {
"file": [
{
"name": "Rob's Doc",
"f_id": "6",
"user_id": "******",
"ts": "1329488441"
},
{
"name": "Objective C",
"f_id": "566",
"user_id": "******",
"ts": "1328116043"
},
{
"name": "Football Challenge",
"f_id": "314",
"user_id": "******",
"ts": "1326396493"
}
],
"view_id": null
}
}
]
ll}}]
0=0 Pragma: no-cache Connection: close Transfer-Encoding: chunked Content-Type: text/html
10c [
{
"cmd": null,
"dat": {
"file": [
{
"name": "**** Doc",
"f_id": "6",
"user_id": "******",
"ts": "1329488441"
},
{
"name": "Objective C",
"f_id": "566",
"user_id": "******",
"ts": "1328116043"
},
{
"name": "Football Challenge",
"f_id": "314",
"user_id": "******",
"ts": "1326396493"
}
],
"view_id": null
}
}
] 0
失敗し、パスのNSHTTPResponse
ステータスコードは200ですので、ページはまだ同様の負荷であるが、私はJSONを取得できない場合は、この応答が発生します。私はブラウザを介して複数の呼び出しを行うことができ、この作業をうまく行ってください。 Androidは、私がそれらを使ってコーディングしていた時間全体でjsonを取得するのに失敗しません。したがって、2つのシステムは私にこの応答を与えません。
ANSWER:
この問題に対する答えは、コードの元の道はチャンスを持っているので、これがある
NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8String]
があるがどうあるべきかNSData
を変換するために使用されているNSString
に関し、その文字列は、まだNSUTF8String
フォーマットであるデータのサイズ外のメモリアドレスからの情報にアクセスして格納しようと試みることになる。文字列を割り当てると、文字列はデータのサイズに過ぎず、データをそのサイズに変換し、そのサイズでのみデータを格納します。
これは、サーバーの応答がJSONオブジェクトにアクセスするための正しい文字列を常に持つようにしました。基本的には、元のコードがオープンされたサイズとコピーであり、あまりにも貪欲なallocであったために、それが想定されていた以上にアクセスしようとしていたという意味で、貪欲になる。
errを参照渡ししていますが、それ以降は確認しません。あなたのsendSynchronousRequestの後にこのようなものを追加してください: 'if(err)NSLog(@" Error:%@ "、[err localizedDescription]);' – bneely
errはnilで何も起動しません。だから私はそれを何も言わないコードに入れます。私はちょうど前に無事になっていたのでダブルチェックを試みましたが、あなたのコールが何か違うことをしたと思っていました。 – Rob
NILオブジェクトの説明を印刷できません。私はgdbデバッガでも同様です。 – Rob