NSURLConnection для нескольких представлений, не получающих данные асинхронно - PullRequest
0 голосов
/ 02 ноября 2011

В моем приложении iPAD у меня есть 6 UITableView. Чтобы получить данные для каждого из табличных представлений, я вызываю веб-службу с помощью NSURLConnection, анализирую XML-файл, полученный от веб-службы, и сохраняю данные в базе данных.

Поскольку у меня есть 6 UITableView, я отправляю запрос Webservice для каждого из представлений одновременно. Однако проблема, с которой я сталкиваюсь, заключается в том, что для моего приложения получение данных из веб-службы в табличном представлении -(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data для 1 зависит от операций базы данных, выполняемых анализаторами других табличных представлений.

Например, запрос веб-сервиса для таблиц A, B, C, D отправляется одновременно. если я получу данные о функции -(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data, пока полученный XML не будет проанализирован и сохранен в моей базе данных, я не получу ответ для других табличных представлений.

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

Вот мой код -

Для отправки запроса веб-сервиса -

- (void) callMedicationWebService
{
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) 
    {
        webData = [[NSMutableData data] retain];
    }
}

-(void) connection:(NSURLConnection *) connection 
didReceiveResponse:(NSURLResponse *) response 
{
    [webData setLength: 0];
}


-(void) connection:(NSURLConnection *) connection 
    didReceiveData:(NSData *) data 
{
    [webData appendData:data];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"HH:mm:ss"];
    NSString *alertMessage = [formatter stringFromDate:[NSDate date]];
    [formatter release];

    NSLog(@"got data back from WS %@", alertMessage);
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
{
    [connection release];

    // Parse xml
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:[CommonHelper decodeHTMLCharactorsFromString:webData]];

    TableAHandler *handler = [[TableAHandler alloc] init];
    [handler initTableAHandler];
    [xmlParser setDelegate:handler];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser setShouldProcessNamespaces:YES];

    BOOL success = [xmlParser parse];
   }

Может ли кто-нибудь помочь мне в том, что я делаю неправильно?

1 Ответ

1 голос
/ 02 ноября 2011

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

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

хотя лучшим решением было бы не использовать 5 разных URLRequests, а использовать только один, который возвращает всю необходимую информацию.

...