Как отобразить значение responseData для ASIHTTPRequest? - PullRequest
0 голосов
/ 06 августа 2010

Я использовал приведенный ниже код в своем приложении регистрации пользователей для взаимодействия с удаленной базой данных.

-(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];
    }

'receiveData' - это объект NSData, объявленный глобально.Я должен получить 'responseData' в виде 0 или 1, который будет храниться в переменной 'receiveData'.

  1. Как проверить значение объекта ReceiveData (0 или 1)?.
  2. checkFirstName: действие будет запущено в поле uitext. Редактирование события DidEnd.

Можем ли мы использовать responseData == 0?Пожалуйста, предложите мне решение ... В ожидании срочного ответа ..

Ответы [ 3 ]

3 голосов
/ 06 августа 2010

Во-первых, вам нужно переосмыслить методы работы ваших методов.

  1. [request didReceiveDataSelector]; возвращает имя метода, который вызывается при получении данных запросом.Поскольку вы не устанавливаете это значение для переменной, эта строка ничего не делает.
  2. if (receivedData==0) не будет делать то, что вы хотите, чтобы она делала.Запрос выполняется асинхронно, поэтому значение receivedData никогда не будет отражать то, что происходит в запросе, который вы запустили двумя строками ранее.
  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, и вам, конечно, не нужно их здесь использовать.Я бы избавился от этих как можно скорее.

Я сделал много предположений о том, каковы были ваши намерения, поэтому оставьте комментарий, если это не то, что вы хотели.Удачи!

0 голосов
/ 06 августа 2010

для начала мне кажется, что вы немедленно проверяете результат запроса, но, будучи асинхронным запросом, проверка произойдет до того, как запрос будет завершен.

Что касается вашего основного вопроса, если сервер отвечает одним символом (просто '0' или '1'), вам может быть лучше использовать [request responseString] напрямую, поскольку он автоматически обнаружит завершение и выполнит преобразование для вас. .

Вы не можете сравнить receivedData с 0 или 1, так как это указатель, и вы не получите ожидаемых результатов.

0 голосов
/ 06 августа 2010

с использованием (responseData == 0) сообщит вам только, выделены ли responseData или нет.

Если я понимаю, что вы сказали, вам нужно проверить ответ, который вы получили из Интернета ...

В этом случае после:

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

Сделайте простой NSLog:

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