0

リモートデータベースと対話するために、ユーザー登録のアプリケーションで以下のコードを使用しました。

-(IBAction)checkFirstName:(UITextField*)textField   
{

    NSURL  *url = [NSURL URLWithString:@"http://mysite.com"];

     ASIFormDataRequest  *request = [ASIFormDataRequest  requestWithURL:url];
     [request setPostValue: firstName.text  forKey:@"firstName"]; 

     [request  setDelegate:self];
     [request  didReceiveDataSelector];
     [request  startAsynchronous];

      firstName.rightViewMode = UITextFieldViewModeAlways;
       if (receivedData==0)
      { 
        UIImage  *image = [UIImage imageNamed:@"close.png"];
        [button  setImage:image  forState:UIControlStateNormal];
        firstName.rightView = button;
      }
}

「firstName」は、ユーザーからの入力に使用したテキストフィールドの値です。以下の方法を使用して、データベースから応答を受け取りました

 -(void)request:(ASIHTTPRequest *)request  didReceiveData:(NSData *)data

    {
      receivedData = [request responseData];
     [receivedData  appendData:data];

     receivedString = [[NSString alloc]  initWithData:receivedData
               encoding:NSUTF8StringEncoding];
    }

「receivedData」は、グローバルに宣言された NSData オブジェクトです。「responseData」を 0 または 1 として取得する必要があり、変数「receivedData」に格納されます。

  1. 「receivedData」オブジェクトの値 (0 または 1) を確認する方法は?
  2. checkFirstName: アクションは uitextfield Editing DidEnd イベントで発生します。

responseData==0 を使用できますか? 解決策を教えてください...緊急の対応を待っています..

4

3 に答える 3

3

まず、メソッドの動作方法を再考する必要があります。

  1. [request didReceiveDataSelector];リクエストがデータを受信したときに呼び出されるメソッド名を返します。この値を変数に設定していないため、この行は何もしません。
  2. if (receivedData==0)あなたがしたいことをしません。リクエストは非同期で実行されるため、の値は、receivedData2行前に開始したリクエストで何が起こったかを反映しません。
  3. receivedDatanullかどうかを確認しようとしていますか?もしそうなら、これを言ってください:if (receivedData == nil)、それはあなたがここで何をしようとしているのかを明確にします。
  4. あなたのrequest:didReceiveDataメソッドでは、リクエストからデータを取得してそれ自体に追加しているように見えます(responseDataリクエストが完了する前にアクセスしたときにプロパティがどのように表示されるかはわかりません。nullの可能性があります)。ここで何が起こっていても、それはあなたが望んでいたことではないと確信しています。

最後に、受信データを自分で本当に集約して解析したい場合を除いて(おそらくそうしないでしょう)、メソッドの代わりにこれら2つのメソッドを実装する必要がありますrequest:didReceiveData

- (void)requestFinished:(ASIHTTPRequest *)request;
- (void)requestFailed:(ASIHTTPRequest *)request;

リクエストが完全に完了した後に呼び出されます。を呼び出して、サーバー応答の文字列値にアクセスします

NSString *receivedString = [request responseString];

メソッドが呼び出されてrequestFinished初めて、名の値を設定できますUITextField

そして、ちょっとしたアドバイスです。Obj-Cでグローバル変数を使用する必要があることはめったになく、ここでそれらを使用する必要はありません。私はそれらをできるだけ早く取り除くでしょう。

私はあなたの意図が何であるかについて多くの仮定をしました、それでこれがあなたが望んでいたものでないならばコメントを残してください。幸運を!

于 2010-08-06T11:13:36.987 に答える
0

(responseData == 0) を使用すると、responseData が割り当てられているかどうかのみがわかります。

あなたの言ったことが理解できたら、Web から得た応答を確認する必要があります...

その場合、後:

receivedString = [[NSString alloc]  initWithData:receivedData
           encoding:NSUTF8StringEncoding];

簡単な NSLog を実行します。

NSLog(@"result: %@", receivedString);
于 2010-08-06T10:38:31.583 に答える
0

そもそも、リクエストの結果をすぐにチェックしているように見えますが、非同期リクエストであるため、リクエストが完了する前にチェックが行われます。

主な質問については、サーバーが 1 文字 (または のみ) で応答する場合'0'、エンコンディングを自動的に検出して変換を行うため、直接'1'使用する方がよい場合があります。[request responseString]

0 または 1と比較することはできませんreceivedData。これはポインターであり、期待される結果が得られないためです。

于 2010-08-06T10:43:47.477 に答える