Параллельные загрузки в iOS - PullRequest
1 голос
/ 11 августа 2011

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

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

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

Любые указатели или помощь очень приветствуются.1009 *

Ответы [ 4 ]

5 голосов
/ 11 августа 2011

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

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

Если вы намерены выполнять вычислительные операции с данными после их загрузки (например, создание миниатюрных изображений, анализ и т. Д.), Вы можете легко отправить эту работу в очередь GCD после завершения загрузки вашего соединения. Таким образом, вы не теряете контроль над процессом загрузки, можете легко отображать ход выполнения или отменять текущие загрузки, но все равно не блокируете основной поток.

1 голос
/ 11 августа 2011

Apple рекомендует, чтобы вы использовали NSURLConnection асинхронно с делегатом, а не с потоками и блокирующим соединением.Если вы используете несколько NSURLConnections в одном потоке, тогда все данные будут возвращены в одном потоке, но это не проблема.Данные каким-то образом не переплетаются, если ваш код не переплетает их, и это не повлияет на производительность сети.

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

0 голосов
/ 11 августа 2011

Вы должны заглянуть в клиентскую библиотеку HTTP как ASIHTTPRequest .

ASIHTTPRequest обрабатывает параллельные запросы, используя очередь, которую вы можете легко ограничить параллелизмом. Пример кода, заимствованный из ASIHttpRequest:

- (IBAction)grabURLInTheBackground:(id)sender
{
   if (![self queue]) {
      [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
   }

   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

Измените [NSOperationQueue maxConcurrentOperationCount], чтобы изменить параллелизм.

0 голосов
/ 11 августа 2011

Это поможет - http://allseeing -i.com / ASIHTTPRequest /

Для параллельной загрузки вы можете использовать ASINetworkQueue.

...