Цель iPhone c запросом Asyncron HTTPS в NSThread - PullRequest
0 голосов
/ 06 марта 2012

Мне нужно хорошее решение для моей маленькой проблемы.

Что у меня есть на данный момент: Мое приложение работает с асинхронным запросом https очень хорошо. На данный момент приложение загружает объект JSON, пока что все хорошо. После этого я сохраняю объект в базе данных sqlite.

Теперь мне нужно изменить, чтобы определить, какой код ответа получил сервер. Я получу код ответа, например, 000, если загруженные данные были действительными, и код, например, 151, если нет. Для этого мне нужно дождаться ответа сервера, чтобы сохранить код ответа и в базе данных.

Я тоже экспериментировал с NSThread. Но это не сработало так, как я ожидал.

Кто-нибудь есть предложения? Я имею в виду, это должно быть одной из самых распространенных вещей;) Я просто не вижу этого.

thx, dominik

Ответы [ 2 ]

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

Я рекомендую вам взглянуть на ASIHTTPRequest , который является оболочкой для API CFNetwork. В частности, рассмотрите механизм, который он предлагает для асинхронных HTTP-запросов, где вы можете определить блоки, которые будут выполнены после того, как запрос завершен или не выполнен, и вы можете легко проверить данные ответа. Ваш код будет выглядеть примерно так:

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  [request setRequestMethod:@"POST"];
  // add your json object to the request
  [request setCompletionBlock:^{
    int responseCode = [request responseStatusCode];
    NSData *responseData = [request responseData];
    // do whatever you want with this info
  }];
  [request setFailedBlock:^{
    NSError *error = [request error];
    // handle the error
  }];
  [request startAsynchronous];
0 голосов
/ 06 марта 2012

Я обычно использую NSOperationQueue для управления своим общением.Это позволяет использовать синхронный запрос вместо асинхронного и обрабатывать весь шебанг одним методом.

Пример:

-(void)doIt {
   NSInvocationOperation *op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doIt_) object:nil] autorelease];
   [opQueue addOperation:op];
}

-(void)doIt_ {
   NSData *data;
   NSMutableURLRequest *request;
   NSURLResponse *response = nil;
   NSError *error = nil;

   // Build request to spec

   data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error];

   // do something with data

   [self performSelectorOnMainThread:@selector(yadda) withObject:yaddayadda waitUntilDone:NO];
}

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

...