как создать синхронный запрос NSURLConnection - PullRequest
1 голос
/ 13 февраля 2012

Я хочу создать синхронный запрос nsurlconnection.Да, я знаю, что это глупо, и я знаю ограничения (замораживание пользовательского интерфейса), однако причина, по которой я хотел бы реализовать это для граната данных, которые я получаю с сервера, принимается в порядке их отправки, что является одним из преимуществсинхронное соединение ... если я правильно прочитал.

Я собираюсь использовать Grand Central Dispatch для достижения многопоточности, чтобы выполнить запрос синхронизации и не влиять на пользовательский интерфейс основного потока ..... но это может произойти позже, а сейчас я бы хотел освоить соединение синхронизации.

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

Здесьмой код.

- (void)loadComics{

    [comics removeAllObjects]; //clears object of any old values
    [[self tableView] reloadData];

    NSURL *url = [NSURL URLWithString:@"http://www.comicbookresources.com/feed.php?feed=previews"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];

    //clear any existing connection
    if (connectionInProgress) {
        [connectionInProgress cancel];
        [connectionInProgress release];
    }

    [xmlData release];
    xmlData = [[NSMutableData alloc] init];

    connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}

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

- (void) connectionDidFinishLoading:(NSURLConnection *)connection{

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];

    [parser setDelegate:self];

    [parser parse];

    [parser release];
    [[self tableView] reloadData];
}

любые примеры были бы хороши.

Ответы [ 2 ]

9 голосов
/ 13 февраля 2012

Если вы хотите синхронное соединение, вы должны использовать + sendSynchronousRequest: returningResponse: ошибка другого простого способа сделать это не существует.

Обратите внимание, что оно устарело в пользу NSURLSession, но он не поддерживает синхронное соединение напрямую.

4 голосов
/ 13 февраля 2012

Синхронная сеть, даже в фоновом потоке, не подходит.Вы не можете должным образом поддерживать отмену, и вы тратите впустую ресурсы, раскручивая фоновый поток, который большую часть своего времени простаивает.Хотя это в основном академическая проблема, если вы отправляете только один URL-запрос, это может быть другая история, если вы отправляете большое их количество.

Вам не нужно беспокоиться о получении connection:didReceiveData: обратные вызовы вышли из строя.То, что вы написали, выглядит хорошо - вы можете просто объединить порции данных по мере их получения и сделать что-то с полными данными в connectionDidFinishLoading:.

Что вам нужно беспокоиться, так это получение нескольких connection:didReceiveResponse: обратных вызовов в случае перенаправления.См. документацию Apple .В этом случае вам просто нужно сбросить данные, которые вы накопили до сих пор, с помощью [xmlData setLength:0].

Наконец, если вам может потребоваться iOS5 или 10.7 и вам не требуется сложность делегата NSURLConnectionтогда новый метод +[sendAsynchronousRequest:queue:completionHandler:] - это хорошая, не злая альтернатива +[sendSynchronousRequest:returningResponse:error].

...