【问题标题】:How to display the value of responseData of ASIHTTPRequest?如何显示 ASIHTTPRequest 的 responseData 值?
【发布时间】:2010-08-06 10:07:09
【问题描述】:

我在我的用户注册应用程序中使用了以下代码与远程数据库进行交互。

-(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 吗?请给我一个解决方案... 等待紧急响应..

【问题讨论】:

  • 只需通过库方法转换 NSString 中的接收数据检查值....:):)

标签: iphone uitextfield response asihttprequest


【解决方案1】:

首先,您需要重新考虑方法的工作方式。

  1. [request didReceiveDataSelector]; 返回请求接收数据时调用的方法名。由于您没有将此值设置为变量,因此此行不执行任何操作。
  2. if (receivedData==0) 不会做你想做的事。该请求是异步运行的,因此receivedData 的值永远不会反映您之前在 2 行开始的请求中发生的情况。
  3. 您是否要检查receivedData 是否为空?如果是这样,请这样说:if (receivedData == nil),它可以清楚地说明您要在这里做什么。
  4. 在您的 request:didReceiveData 方法中,您似乎正在从请求中获取数据并将其附加到自身(我不确定当您在请求完成之前访问 responseData 属性时会是什么样子。它可以为空)。不管这里发生了什么,我很确定这不是你想要发生的。

最后,除非您真的想自己聚合和解析传入的数据(您可能不想),否则您应该实现这两种方法而不是request:didReceiveData 方法。

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

在请求完成后调用它们。通过调用访问服务器响应的字符串值

NSString *receivedString = [request responseString];

只有在你的requestFinished方法被调用后,你才能设置你的名字UITextField的值。

还有一点建议:您很少需要在 Obj-C 中使用全局变量,而且您当然不需要在这里使用它们。我会尽快摆脱那些。

我对您的意图做了很多假设,所以如果这不是您想要的,请发表评论。祝你好运!

【讨论】:

  • @Kubi,非常感谢您的回复。我对此很清楚。 - (void)requestFinished:(ASIHTTPRequest *)request { NSString *receivedString = [response responseString];我得到了空字符串..我可以再包含更多内容来接收响应吗?如何返回 textField 方法以将响应与 0 或 1 进行比较?请回复..
  • 对不起,我的回答有误。应该是[request responseString];
  • 另外,您希望从您的请求中得到什么?只是 1 或 0,还是只是想确定是否有任何响应?
  • Kubi,看看你回复中的这一行:- NSString *receivedString=[response responseString];用“请求”对象替换“响应”。纠正我,如果我错了。也回复我之前的评论..
  • Kubi,我使用 NSURL 类来接收来自远程服务器的响应。我已经完成了它,对于一个值(我的应用程序,注册表单)。我的问题是:如何为多个文本字段调用 NSURLConnection 的方法“didReceiveData”。请帮助我。
【解决方案2】:

使用 (responseData == 0) 只会告诉您是否分配了 responseData。

如果我明白你所说的,你需要检查你从网络上得到的回复......

在这种情况下:

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

做一个简单的 NSLog :

NSLog(@"result: %@", receivedString);

【讨论】:

  • 我检查了 NSLog,但没有调用 didReceiveData: 方法。感谢您的回复。
【解决方案3】:

首先,在我看来,您好像是在立即检查请求的结果,但作为异步请求,检查将在请求完成之前进行。

至于您的主要问题,如果服务器响应一个字符(仅'0''1'),您最好直接使用[request responseString],因为它会自动检测编码并为您进行转换.

您不能将receivedData 与 0 或 1 进行比较,因为它是一个指针,您不会得到预期的结果。

【讨论】:

  • Jalences,谢谢你的帮助.. 你说的是对的。但是,我必须在哪里使用:[re​​quest responseString]?我可以直接将此“响应字符串”与 0 或 1 进行比较吗?如何对我的应用程序的多个文本字段重复此检查?等待快速响应...
  • 是的,您可以多次比较响应字符串,但是...正如 kubi 发布的那样,这可能不是您需要的。为什么要将相同的响应与多个文本字段进行比较?我无法想象是什么导致您进行此设计,请详细说明您的应用需要做什么。
  • 我的应用类似于 Twitter 注册表单。在此,当新用户在提供的字段中提供他的详细信息时,它会显示它们的可用性,就在输入的值旁边。所以,我的要求是:当我使用 [request responseString] 时,它返回 NULL 值。可以使用模拟器吗?如果可能,我如何使用 ASIHTTPRequest 从远程 URL 检索响应(整数值)?如何对我的应用程序中的所有输入字段重复此操作?谢谢。
  • 那么您需要为每个字段发出一个新请求,因为即使对于相同的值,不同的字段也会有不同的可用性。如果您发出异步请求,则在您实现的每个 requestFinished 委托方法上(每个字段都应该有单独的委托方法),您更新字段旁边的标签
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多