Логическая проблема - Класс NSObject - Начинающий - PullRequest
0 голосов
/ 14 марта 2012

У меня есть 2 вопроса.

1.) Я создаю класс NSObject, и у меня есть следующий код в нем.(ASIHTTPRequest POST).Имя класса NSObject называется SendToServer.Я называю класс следующим образом:

SendToServer *sv = [[SendToServer alloc]];
sv.grabURLInTheBackground ;
NSLog(@"This line is executed ");

Ниже приведен код из класса SendToServer NSObject.

- (void)grabURLInTheBackground
{
   if (![self queue]) {
      [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
   }

   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

Проблема заключается в том, что код выполняетсястрока sv.grabURLInTheBackground ; и до того, как она выполнит методы requestDone или requestWentWrong, она выполнит NSLog (NSLog(@"This line is executed ");)

То, что я хочу, чтобы моя программа, - это завершить все операции в SendToServer NSObject class и затем Выполните NSLog (В последовательности).

Сначала выполните sv.grabURLInTheBackground ;, как только все действия в этом методе / классе закончены, затем вернитесь к коду и выполните другую строкучто NSLog(@"This line is executed ");.

2.) Мне нужно вернуть строку при выполнении метода requestDone.Как мне изменить код для этого;

- (NSString * )requestDone:(ASIHTTPRequest *)request {
}

, но как мне отредактировать [request setDidFinishSelector:@selector(requestDone:)]; для приведенного выше кода?

------------------------------------------------------------------------------------------------------------------------------------------

РЕДАКТИРОВАТЬ

Я делаю это для входа в систему.После нажатия кнопки я буду вызывать метод grabURLInTheBackground из класса NSObject.И viewcontroller должен знать, был ли вход пользователя успешным или неудачным.

SendToServer *sv = [[SendToServer alloc]];
[sv grabURLInTheBackground] ;
NSLog(@"User login SUcess or failed %@", [sv userloginSucessOrFail]);

Например, скажем, [sv userloginSucessOrFail] возвращает, если вход пользователя был успешным или неудачным.

Что здесь происходит,заключается в том, что после вызова [sv grabURLInTheBackground] он напрямую отправляется и выполняет строку кода NSLog(@"User login SUcess or failed %@", [sv userloginSucessOrFail]);.

Я хочу найти способ сообщить моему ViewCOntroller, был ли вход пользователя успешным или неудачным.

1 Ответ

0 голосов
/ 14 марта 2012

Первый: вызовите init на вашем объекте.

Второе: grabURLInTheBackground - это метод, а не свойство.Он должен вызываться в квадратных скобках

Таким образом, ваш код становится:

SendToServer *sv = [[SendToServer alloc] init];
[sv grabURLInTheBackground];
NSLog(@"This line is executed ");

Для выполнения пункта 1) вам необходимо сделать синхронный запрос

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
  NSError *error = [request error];
  if (!error) {
    NSString *response = [request responseString];
  }

Проблемазаключается в том, что если этот код выполняется в основном потоке, это блокирует (не хорошо) ...

Для второго пункта.Вы не можете.

РЕДАКТИРОВАТЬ: Что вам нужно сделать, это что-то вроде следующих шагов:

  • Перед вызовом grabURLInTheBackground вы должны уведомить пользователя, что запросв ожидании .. как установка UIActivityIndicator или отключение пользовательского интерфейса, ...

  • при получении обратного вызова, затем обновите пользовательский интерфейс: скройте индикатор активности, повторно включите пользовательский интерфейс ..или если запрос не удался, сообщите пользователю.

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