2

sendSynchronousRequestNSURLResponseに変更が発生していないのに毎回情報を受け取らないのはなぜですか? 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であったために、それが想定されていた以上にアクセスしようとしていたという意味で、貪欲になる。

+0

errを参照渡ししていますが、それ以降は確認しません。あなたのsendSynchronousRequestの後にこのようなものを追加してください: 'if(err)NSLog(@" Error:%@ "、[err localizedDescription]);' – bneely

+1

errはnilで何も起動しません。だから私はそれを何も言わないコードに入れます。私はちょうど前に無事になっていたのでダブルチェックを試みましたが、あなたのコールが何か違うことをしたと思っていました。 – Rob

+0

NILオブジェクトの説明を印刷できません。私はgdbデバッガでも同様です。 – Rob

答えて

1

ANSWER:

この問題に対する答えは、コードの元の道はチャンスを持っているので、これがある

NSString *sData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] 

があるがどうあるべきかNSDataを変換するために使用されているNSStringに関し、その文字列は、まだNSUTF8Stringフォーマットであるデータのサイズ外のメモリアドレスからの情報にアクセスして格納しようと試みることになる。文字列を割り当てると、文字列はデータのサイズに過ぎないため、データをそのサイズに変換し、そのサイズでのみデータを格納します。これは私のサーバーの応答がJSONオブジェクトにアクセスするための正しい文字列を常に持つようにしました。基本的には、元のコードがオープンされたサイズとコピーであり、あまりにも貪欲なallocであったために、それが想定されていた以上にアクセスしようとしていたという意味で、貪欲になる。

関連する問題