2

NSURLResponse変更が発生していないのに、なぜ inがsendSynchronousRequest毎回情報を受信しないのか疑問に思っていました。受信しているように見えますがNSData、文字列に変換されておらずNSArray、json 呼び出しを介して変換されていません。コードは以下です。以下のコードはすべて単一の関数になっていますが、名前が必要だとは思わないでください。

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毎回それを変換してnilではない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 つのシステムではこの応答が得られません。

答え:

この問題に対する答えは、あるべきものNSStringを変換するために使用されている に関係していますNSData

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

これは、コードの元の方法では、文字列が、まだNSUTF8Stringフォーマットされているデータのサイズの範囲外のメモリ アドレスから情報にアクセスして格納しようとする可能性があるためです。文字列を割り当てると、文字列はデータのサイズにすぎないため、データをそのサイズにのみ変換し、そのサイズでのみデータを保存します。

これにより、サーバーの応答には、JSON オブジェクトにアクセスするための正しい文字列が常に含まれていました。基本的には、元のコードが想定以上にアクセスしようとしていたという意味で、より適切な単語が不足しているためのポインターの問題でした。これは、サイズとコピーが制限されておらず、少し貪欲すぎた alloc が文字列を許可しないためです。貪欲であること。

4

1 に答える 1

1

答え:

この問題に対する答えは、あるべきものNSStringを変換するために使用されている に関係していますNSData

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

これは、コードの元の方法では、文字列が、まだNSUTF8Stringフォーマットされているデータのサイズの範囲外のメモリ アドレスから情報にアクセスして格納しようとする可能性があるためです。文字列を割り当てる場合、文字列はデータのサイズのみであるため、データをそのサイズにのみ変換し、そのサイズでのみデータを保存します。これにより、サーバーの応答には、JSON オブジェクトにアクセスするための正しい文字列が常に含まれていました。基本的には、元のコードが想定以上にアクセスしようとしていたという意味で、より適切な単語が不足しているためのポインターの問題でした。これは、サイズとコピーが制限されておらず、少し貪欲すぎた alloc が文字列を許可しないためです。貪欲であること。

于 2012-04-13T13:12:05.190 に答える