Синхронный NSURLConnection Threading на iPhone - PullRequest
1 голос
/ 24 декабря 2009

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

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

Синхронные NSURLConnections прекрасно работают внутри NSOperation - и поскольку вы используете их синхронно, NSOperationQueue передал NSOperations автоматически использует фоновый поток для их запуска (вы должны выполнить дополнительную работу в противном случае).

Работа URL-соединений в фоновом потоке является ключом к поддержанию отзывчивости пользовательского интерфейса, чего асинхронный NSURLOperation не выполняет по умолчанию (посмотрите, в какой поток входят все обратные вызовы данных).

Иногда вы хотите обрабатывать входящие данные (например, если у вас есть индикатор выполнения), и в этих случаях асинхронные URL-соединения лучше, они все еще могут быть в NSOperation.

Поскольку это вас расстраивает, вы, возможно, захотите взглянуть на альтернативную библиотеку ASIHTTPRequest, также основанную на NSOperation, но, похоже, это может сделать вас менее болезненным (у них хороший пример кода):

http://allseeing -i.com / ASIHTTPRequest /

2 голосов
/ 24 декабря 2009

Синхронный вызов NSURLConnection должен быть в состоянии застрять в фоновом потоке, но я настоятельно рекомендую вам разобраться с «хлопотами» и сделать это The Right Way ™.Лучший способ извлечения данных при сохранении интерактивности пользовательского интерфейса - это использовать асинхронные методы NSURLConnection.

1 голос
/ 24 декабря 2009

Из интереса, какие проблемы возникают у вас с получением данных? Я обнаружил, что использование асинхронного NSURLConnection и NSNotificaion, когда оно закончилось, оказалось довольно удобным решением.

В классе, где вам нужны данные (я обычно помещаю их в метод init)

-(id)init{
    ... object setup ...
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
}

updateView - это метод, который вызывается, когда соединение завершило получение данных

в NSURLConnection

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

//Notify that we are finished
[[NSNotificationCenter defaultCenter] postNotificationName:soapAction object:self];

}

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

...