Загрузка нескольких файлов в приложении iphone (Цель c) - PullRequest
4 голосов
/ 19 июня 2009

В моем приложении для iPhone я хочу загрузить несколько файлов, которые находятся на IIS с аутентификацией.По нажатию кнопки я хочу начать процесс загрузки.

Я знаю, как загрузить файл с аутентификацией.

    NSURLRequest* request =
               [NSURLRequest requestWithURL:mMovieURL 
                             cachePolicy:NSURLRequestUseProtocolCachePolicy 
                             timeoutInterval:60.0];
    movieConnection =
            [[NSURLConnection alloc] initWithRequest:request delegate:self ];

, и у меня есть пара методов делегата с приведенным выше кодом.

Но как это сделать с mutlipleидет одновременно.

Спасибо,

Ответы [ 5 ]

7 голосов
/ 19 июня 2009

Я не знаком с MultipleDownload, но в случае, если он не отвечает вашим потребностям, я решаю, что у вас есть один объект, который является делегатом для многих NSURLConnections, и вы хотите знать, как держать их прямо.

Все методы делегата возвращают сам NSURLConnection в качестве первого параметра. Таким образом, вы можете отслеживать, какие данные куда идут, проверяя, какой NSURLConnection перезванивает вам. Один из способов сделать это - NSDictionary, который сопоставляет соединение с его NSMutableData объектом. Хитрость заключается в том, что вы не можете сделать ключом в словаре NSURLConnection, потому что он не соответствует NSCopying (и вы бы этого не хотели). Один из способов обойти это - использовать адрес соединения, такой как:

NSString *key = [NSString stringWithFormat:@"%p", connection];

Это вернет уникальный ключ для любого объекта (шестнадцатеричное представление его адреса). Некоторые люди используют description для этой цели, но мне это не нравится, потому что это плохо определенный интерфейс. Там нет обещания, что он будет уникальным. В системах, где я часто это делаю, я реализую выше -stringWithFormat: в методе с именем -uniqueIdentifier и делаю его категорией в NSObject, чтобы в словаре можно было отследить что угодно.

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

РЕДАКТИРОВАТЬ: заменил% x у меня было выше на% p, как отметил Питер. Он прав, а я не думал правильно. Дважды проверив мой код, я фактически использовал% p, столкнувшись с этой ошибкой раньше ....

6 голосов
/ 19 июня 2009

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

http://github.com/leonho/iphone-libs/tree/master

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

self.urls = [NSMutableArray arrayWithObjects:
    @"http://maps.google.com/maps/geo?output=json&q=Lai+Chi+Kok,Hong+Kong",
    @"http://maps.google.com/maps/geo?output=json&q=Central,Hong+Kong",
    @"http://maps.google.com/maps/geo?output=json&q=Wan+Chai,Hong+Kong",
    nil];

self.downloads = [[MultipleDownload alloc] initWithUrls: urls];
self.downloads.delegate = self;

Удачи.

2 голосов
/ 19 июня 2009

Я думаю, что самый простой способ сделать это - использовать NSOperation - и NSOperationQueue.

Это будет означать, что вы можете указать, должна ли каждая операция выполняться последовательно или параллельно. Вы можете даже ограничить количество параллельных операций - так, чтобы одновременно выполнялось максимум 5 (скажем) операций, а затем другие операции выстраивались в очередь.

Это действительно отличный способ позволить ОС выполнять несколько операций - и хорошо сочетается с ленивой философией загрузки iPhone OS.

Затем вы можете заставить каждую операцию выполнить обратный вызов по окончании - или даже выполнить обратный вызов прогресса в главном потоке.

Я изменил свой код, чтобы все теперь работало таким образом, и нашел его гораздо более надежным и легким в использовании.

1 голос
/ 10 февраля 2010

Я не знаком с MultipleDownload, но в случае, если это не соответствует вашим потребностям, проблема, которую я принять это, что у вас есть один объект, который является делегатом для многих NSURLConnections, и вы хотите знать, как держать их прямо.

Все методы делегата возвращают Сам NSURLConnection как их первый параметр. Таким образом, вы можете отслеживать какие данные куда, путем тестирования, который NSURLConnection перезванивает. Один из способов сделать это с NSDictionary, который отображает соединение к его объекту NSMutableData. Теперь Хитрость в том, что вы не можете сделать NSURLConnection будет ключом в словарь, потому что он не соответствует на NSCopying (и вы не хотели бы это к). Один из способов обойти это используйте адрес подключения такой как:

ключ NSString * = [строка NSString stringWithFormat: @ "% p", соединение];

Лучше было бы использовать NSValue с конструктором valueWithNonretainedObject. Таким образом, вы можете получить доступ к ключевому объекту из NSDictionary, если вам нужно.

0 голосов
/ 20 июня 2009

NSURLConnection является асинхронным и init завершается немедленно. Просто запустите его несколько раз.

NSArray *connections = [[NSArray alloc] initWithObjects:
  [[NSURLConnection alloc] initWithRequest:request1 delegate:self ],
  [[NSURLConnection alloc] initWithRequest:request2 delegate:self ],
  [[NSURLConnection alloc] initWithRequest:request3 delegate:self ],
  [[NSURLConnection alloc] initWithRequest:request4 delegate:self ],
  nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...