Проблемы с получением нескольких NSURLConnections для параллельной работы - PullRequest
1 голос
/ 05 июня 2011

Я пытаюсь заставить несколько NSURLConnections работать параллельно (синхронно), однако, если он не работает в главном потоке (блок кода закомментирован ниже), соединение с URL не работает вообще (нетметодов делегата NSURLConnection вызваны).Вот код, который у меня есть (файл реализации подкласса NSOperation):

- (void)start
{
    NSLog(@"DataRetriever.m start");
    if ([self.DRDelegate respondsToSelector:@selector(dataRetrieverBeganExecuting:)])
        [self.DRDelegate dataRetrieverBeganExecuting:identifier];

    if ([self isCancelled]) {
        [self finish];
    } else {

        /*
        //If this block is not commented out NSURLConnection works, but not otherwise
        if (![NSThread isMainThread])
        {
            [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
            return;
        }*/

        SJLog(@"operation for <%@> started.", _url);

        [self willChangeValueForKey:@"isExecuting"];
        _isExecuting = YES;
        [self didChangeValueForKey:@"isExecuting"];

        NSURLRequest * request = [NSURLRequest requestWithURL:_url];
        _connection = [[NSURLConnection alloc] initWithRequest:request
                                                      delegate:self];
        if (_connection == nil)
            [self finish];
    } //not cancelled


}//start

Пробежал по нему с помощью отладчика, и после завершения этого метода запуска ни один из делегатов NSURLConnection не сработал (я установил точки останова там).Но на основной ветке все работает просто отлично.Есть идеи, что случилось?Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 июня 2011

Фоновые потоки не имеют автоматически активного цикла выполнения . Вам нужно запустить цикл выполнения после того, как вы создадите NSURLConnection, чтобы получить какой-либо вход от него. К счастью, это довольно просто:

[[NSRunLoop currentRunLoop] run];

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

Если вы действительно хотите выполнить синхронное соединение, вы должны использовать sendSynchronousRequest:returningResponse:error:, который будет напрямую возвращать данные. Подробнее см. «Загрузка данных синхронно» .

1 голос
/ 05 июня 2011

NSURLConnection нуждается в активном цикле выполнения, чтобы фактически работать;самый простой способ убедиться в этом - просто запустить его из основного потока.

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

...