2014-11-29 6 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]; 
} 

! 속도는 약 200K/s이며 Android가있는 시간은 iPhone보다 2/3 이하입니다. 약 4.6M의 MP4를 다운로드하면 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 

그러나 다른 앱을 사용하여 영화를 다운로드 할 때 2M/s가 될 수 있습니다. afnetworking을 사용할 때 나는 틀린가? 어떻게 일어나고, 어떻게 처리해야합니까? 또 다른 질문은 으로 마지막 요청을 모니터링하는 것이 잘못되었다는 것입니다. (i == _collectionArr.count - 1) {[SVProgressHUD showSuccessWithStatus : @ "Done"];}하지만 올바른 대답을 모르겠습니다.

도움 주셔서 감사합니다.

+0

당혹 스럽네요. 나는 신선하고 블록에 대해 잘 모릅니다. 죄송합니다. 그리고 올바른 해결책이 무엇인지 보여줄 수 있습니까? 고마워. –

+0

나는 영화 싱글을 다운로드 받는다. –

+1

불행히도 나는 AFNetworking에 대해 아무것도 모릅니다. 왜 당신은 애플이 제공하는 NSURLSession을 사용하지 않습니까? – matt

답변

2

생각의 몇 다음 HUD의

  1. 제거 i 안타 count - 1이 올바르지 않습니다. 모두 완료되기 전에 실제로 제거 할 수 있습니다. 다운로드가 두 번 시작하면 하나는 거대한 하나는 작은 하나는 두 번째 하나가 완료되면 HUD가 해고되지만 다른 하나는 아직 완료되지 않을 수 있습니다. 이것들은 동시에 실행되기 때문에, 마지막에 제출 된 것이 완료 될 때까지가 아니라 모두 완료 될 때까지 기다려야합니다.

    디스패치 그룹을 사용하는 방법 중 하나는 디스패치 그룹을 사용하는 것입니다. 디스패치 그룹은 요청을 제출하고 완료 블록에서 나가고 HUD를 제거하는 디스패치 그룹 알림을 추가 할 때 사용합니다.

  2. 이 코드 외부에서 메인 스레드를 차단할 수있는 다른 작업을 수행하지 않으셨습니까? AFNetworking은 완료 블록을 기본 대기열로 보내고 주 스레드를 차단하면이 성능에 영향을줍니다. 인스트루먼트를 사용하여 대기중인 스레드를 식별하거나 테스트 목적으로 만 managercompletionQueue을 일시적으로 자신의 생성의 일부 사용자 지정 큐로 변경할 수 있습니다.

    예를 들어, for 루프 전에, 같은 수행이 메인에 특별한 일을하지 않는 한 나 같은 가능성 파업 불구하고 (방정식에서 차단 메인 스레드를 취할 것

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

    을 실). 일단 이것이 완료 블록에 대한 메인 쓰레드를 사용하기를 원하기 때문에 이것이 문제가 아니라는 것을 확인했다면, 그 라인을 주석 처리하십시오.

  3. perf 문제가 주 스레드 경합 문제와 관련이 없다는 것을 확인한 후에는 대체 기술 (예 : 자신의 NSURLSession 등)을 벤치마킹하는 것이 좋습니다. 이것은 시뮬레이터 대 디바이스 성능, 캐싱 등과 같은 문제가 아니라 AFNetworking인지 여부를 진단하는 데 도움이 될 수 있습니다. 솔직히 AFNetworking 자체가 문제는 아닌 것 같습니다.