2014-04-25 1 views
9

머리글 (길이 및 유형)을 확인한 후에 특정 파일 (전부는 아님)을 다운로드해야하지만 동일한 작업에 있어야합니다. 새 작업/요청 만들기 (짧은 시간에 많은 연결로 인해 서버에서 오류가 발생하기도 함). 그래서 내가 작업 시작 : 이후,NSURLSessionDataTask를 백그라운드 지원이 포함 된 다운로드 작업으로 변환

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
didReceiveResponse:(NSURLResponse *)response 
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
{ 
    if(XXXXXXXXXX){ 
     NSLog(@"transform into a download"); 
     completionHandler(NSURLSessionResponseBecomeDownload); 
    }else{ 
     NSLog(@"Keep loading normally"); 
     completionHandler(NSURLSessionResponseAllow); 
    } 
} 

그러나 그런 다음

NSURLSessionConfiguration *configuratione = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *sessione = [NSURLSession sessionWithConfiguration:configuratione delegate:self delegateQueue:nil]; 
NSURLSessionDataTask *datatask = [sessione dataTaskWithRequest:request]; 
[datatask resume]; 

을, 그 첫 번째 응답을 수신 할 때이 대표로 다운로드 작업으로 데이터 작업을 변환 할 수 있습니다 알고 데이터 작업은 BackgroundSessionConfiguration을 사용할 수 없습니다. 새로 만든 다운로드가 동일한 기본 세션 구성을 사용한다고 가정합니다. 백그라운드에서 해당 다운로드를 계속 실행하려면 어떻게해야합니까? 세션을 백그라운드로 변경하는 방법이 있습니까? 아니면 접근 방식이 될 것인가?

답변

8

이 질문은 당신의 디자인에 따라 (sessionType, taskType, FG/BG 생성) 모두가 제한되어 있다는 분명한 대답, 이음새를 말하기 어렵습니다. 세션 이후

구성 에 깊은 사본 유지 (결정 기본/배경/임시 세션 자연 형), 세션 을 개시 한 후 (우리의 경우 : 기본 타입 - 세션) 당신 이 현재 세션에 대한 configuration-Object를 더 이상 수정할 수 없습니다. 따라서 디자인이 새로운 (희망 사항) BG-type-Session과 관련된 새 작업을 허용하지 않는다면 마술처럼 "dataTask"를 "downloadTask"로 변환 할 방법이 없습니다.

가 명심 NSURLSessionDataTaskNSURLSessionDownloadTaskNSURLSessionTask의 두 서브 클래스, NSURLSessionDataTask 및 NSURLSessionDownloadTask 들어오는 응답 데이터 (파일 현명한 각각 VS 조각 - 현명한) 처리 매우 다르게 프레임 워크에 의해 구현된다 .

매력적인 환상이 매력적인 방법 URLSession:dataTask:didBecomeDownloadTask: 될 수 있지만, 당신은 현재 (깊이 당신의 이전에 구성된 기본 형 날인) 세션과 연관된 새 작업 (증서에 DownloadTask)를 만들고를 떠나야한다 원래 작업 (dataTask)은 고아로 처리됩니다. 내 이해는 귀하의 디자인은 작업의 추가 생성으로 인해이 옵션을 취할 수 없다뿐만 아니라 당신은 기본 형식의 세션 구성으로 있어야합니다.

URLSession : dataTask : didBecomeDownloadTask : dataTask : wasReplacedByDownloadTask : 정말 URLSession로 지정해야

수신 할 때

지금 만 간단한 해결책을 데이터 작업-위임에 (클래스 NSURLSessionDataDelegate 프로토콜을 구현),이다 URLSession : dataTask : didReceiveData : 초기 호출, 특정 방법으로 해당 조각 데이터를 저장하기 시작합니다. (NSURLSessionDownloadTask의 기본 동작을 시뮬레이트하는 임시 파일에 저장)이 NSOperationQueue에서이 위임을 비동기 적으로 실행하는지 확인하십시오. ("배경 능력"이라고 생각합니다. NSUperationQueue에 의해 스레드 메커니즘을 밑줄로 표시 할 수있는 보조 스레드), 다운로드가 완료 될 때까지 축적 된 결과가 누적 된 결과가 있는지 확인하십시오. (오류를 처리하거나 다른 곳에서 파일을 전송하는 경우)이 일반적인 NSURLSessionTaskDelegate 메소드 "URLSession : 작업 : didCompleteWithError "

당신은 다운로드 (안 NSURLSessionDownloadTask)로 (A NSURLSessionDataTask으로 표시) 요청 변환 , 이렇게. 이 변환을 백그라운드 대기열에서 처리하려면 다음과 같이 (세션/작업)이 위임 메소드의 마지막 매개 변수에 nil이 아닌 값을 제공하십시오. 그렇지 않으면 직렬 작업 대기열이 "백그라운드 기능"필요를 충족시키지 못합니다.

NSOperationQueue* aQueue = [[NSOperationQueue alloc] init]; 

NSURLSession *sessione = [NSURLSession sessionWithConfiguration:configuratione delegate:self delegateQueue: aQueue]; 

다른 아이디어는 수동으로 여러 개의 NSOperation 개체를 실행하고, 다운로드 작업에 대한 비동기 실행을 보장하기 위해 시작 방법을 무시하므로 조금 까다 롭습니다.

더 나은 해결책을 가진 다른 모든 사람들은 스파크를 더 많이 가져 오거나 제가 잘못했을 가능성이있는 부분을 수정하십시오.

+1

귀하의 솔루션은 백그라운드 구성과 상당히 다르며 다운로드는 OS 관리 프로세스에 있으며 백그라운드에서 실행 중이며 OS에 의해 종료 된 경우에도 계속됩니다. –

+0

다운로드 작업이 데이터 작업보다 훨씬 강력하다고 말할 수 있습니까? 왜냐하면 ** (1) ** 앱을 연속해서 실행하면 다운로드를 재개 할 수 있기 때문입니다. ** (2) ** 앱을 다운로드 한 상태로 유지하는 것이 활성 상태가 아니기 때문에 사용자에게는 매력적입니다. – NSPratik

관련 문제