2014-11-29 3 views
2

Мне нужно загрузить несколько изображений и видео с сервера:Как повысить скорость при использовании NSURLSessionDownloadTask?

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
for (int i = 0; i < _collectionArr.count; ++i) { 

    NSURL *URL = [NSURL URLWithString:URL_ADDRESS(portNumber,_collectionArr[i])]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
     NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; 
     return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; 
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 

     NSLog(@"File downloaded to: %@", filePath); 
     if (i == _collectionArr.count - 1) { 
      [SVProgressHUD showSuccessWithStatus:@"Done"]; 
     } 

    }]; 
    [downloadTask resume]; 
} 

Я обнаружил, что это так медленно! Скорость составляет около 200 К/с, а время с Android на 2/3 меньше, чем у iPhone. Когда я загружаю mp4 около 4.6M, он занимает 15 секунд.

2014-11-29 13:46:35.071 testDownload[2105:47825] Begin 
2014-11-29 13:46:51.740 testDownload[2105:47825] File downloaded to: file:///Users/apple/Library/Developer/CoreSimulator/Devices/259F2CB8-01FD-47C2-A38F-6100A2FF350A/data/Containers/Data/Application/71E553BC-F85D-4BFA-8937-FE9026FDF65C/Documents/VTS_01_audi.mp4 

Но когда я использую другое приложение для загрузки фильмов, оно может составлять 2 М/с. Я ошибаюсь, когда пользуюсь сетью? Как это происходит и что я могу сделать, чтобы справиться с этим. Другой вопрос, что я знаю, что неправильно следить за последним запросом с помощью if (i == _collectionArr.count - 1) {[SVProgressHUD showSuccessWithStatus: @ "Done"];} Но я не знаю правильного ответа.

Благодарим за помощь.

+0

Смущенный. Я свежий человек и плохо знаю о блоке. Сожалею. И можете ли вы показать мне, какое правильное решение? Большое спасибо. –

+0

Я загружаю сингл фильма, но это было то же самое. –

+1

К сожалению, я ничего не знаю о AFNetworking. Почему бы вам просто не использовать NSURLSession, которую Apple дает вам? – matt

ответ

2

Пара мыслей:

  1. Удаление HUD когда i хиты count - 1 не является правильным. Фактически вы можете удалить его, прежде чем все будет сделано. Если вы начнете две загрузки, один огромный один и один крошечный, HUD будет уволен, когда второй закончится, а другой еще не будет выполнен. Они запускаются одновременно, поэтому вам нужно подождать, пока они не будут выполнены, а не только после того, как будет отправлен последний отправленный.

    Один из способов сделать это - использовать группу отправки (которую вы вводите при отправке запросов, оставить в блоке завершения, а затем добавить уведомление группы отправки, которое удаляет HUD).

  2. Вы ничего не делаете вне этого кода, который может блокировать основной поток? AFNetworking отправляет свои блоки завершения в основную очередь, и если вы заблокируете основной поток ни для чего, это повлияет на эту производительность. Вы можете либо использовать Инструменты для идентификации ожидающих потоков, либо только для целей тестирования, временно изменить completionQueuemanager на какую-то пользовательскую очередь вашего собственного создания.

    Например, перед вашим for петли, сделать что-то вроде:

    manager.completionQueue = dispatch_queue_create("com.example.app.netCompletionQueue", NULL); 
    

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

  3. Как только вы подтвердите, что проблема с перфорацией не является результатом проблемы с обсуждением основной темы, я бы предложил провести сравнительный анализ альтернативных методов (например, ваш собственный NSURLSession и т. Д.). Это может помочь диагностировать, является ли проблема AFNetworking, а не чем-то вроде симулятора и производительности устройства, кеширования и т. Д. Честно говоря, я считаю маловероятным, что AFNetworking сама по себе является проблемой.

Смежные вопросы