2014-09-11 2 views
2

파일 다운로드와 관련된 데이터 처리를 모니터링하는 NSProgress 객체 트리가 있습니다. NSURLSession을 백그라운드 구성으로 사용하여 다운로드가 완료됩니다.iOS 8 - NSWRLSessionDownloadTask에 의해 생성 된 fractionCompleted = 1.0의 NSProgress 객체

프로세스를 시작하면 최상위 NSProgress 개체가 예기치 않은 fractionCompleted 수치를보고합니다. 문제를 디버깅하여 ("Hello World"응용 프로그램으로 분리) NSProgress 개체가 [NSURLSession downloadTaskWithRequest :]를 호출 한 결과로 만들어졌으며 위 메서드를 호출 한 직후 fractionCompleted 속성이 1.0임을 알게되었습니다. 이 NSProgress 개체는 내 NSProgress 트리의 일부분이므로 트리에서 진행률 수치를 상쇄하면 NSProgress 트리의 일부가됩니다.

이 샘플 응용 프로그램에서는 NSProgress 개체를 통해 진행률을보고하는 다운로드와 함께 더미 백그라운드 작업을 시작합니다. 내가 그렇게 한 이유는 NSURLSession이 NSProgress 개체를 만들지 않는다는 것입니다 (Apple이 주장하는 것입니다). NSProgress 트리에 적어도 하나 이상있을 것입니다. 그 결과

<NSProgress: 0x7ff8dae06b10> : Parent: 0x0/Fraction completed: 0.5000/Completed: 0 of 1 
    <_NSProgressGroup: 0x7ff8dae0f450> : Portion of parent: 1 Children: 1 
    <NSProgress: 0x7ff8dae0f880> : Parent: 0x7ff8dae06b10/Fraction completed: 0.5000/Completed: 0 of 100 
     <_NSProgressGroup: 0x7ff8dae0fec0> : Portion of parent: 100 Children: 2 
     <NSProgress: 0x7ff8dad74b90> : Parent: 0x7ff8dae0f880/Fraction completed: 1.0000/Completed: 1 of 1 
     <NSProgress: 0x7ff8daf036c0> : Parent: 0x7ff8dae0f880/Fraction completed: 0.0000/Completed: 0 of 100 

, 진행보고 이상한 가져옵니다

바로 NSProgress 트리 모양을 여기 다운로드 및 더미 작업을 실행 한 후 NSProgress 트리를 기록 가졌어요. 나는 다운로드를 시작하기 위해 호출을 주석 경우

는 ([자기 resumeDownload])는 다음 NSProgress 트리가 보이는 같은 :

<NSProgress: 0x7febca52ac90> : Parent: 0x0/Fraction completed: 0.0000/Completed: 0 of 1 
    <_NSProgressGroup: 0x7febca529e60> : Portion of parent: 1 Children: 1 
    <NSProgress: 0x7febca529ff0> : Parent: 0x7febca52ac90/Fraction completed: 0.0000/Completed: 0 of 100 
     <_NSProgressGroup: 0x7febca52ced0> : Portion of parent: 100 Children: 1 
     <NSProgress: 0x7febca52d780> : Parent: 0x7febca529ff0/Fraction completed: 0.0000/Completed: 0 of 100 

당신은 fractionCompleted = 1.0과 아무런 추가 NSProgress 객체가없는 볼 수 있듯이 진행보고는 괜찮습니다.

이제 NSProgress (fractionCompleted = 1.0)은 NSURLSession 또는 그 아래의 항목이 아닌 경우 어디서 오는지 알 수 없습니다. (Apple은 NSURLSession이 NSProgress 객체를 생성하지 않는다고 말했습니다.) iOS 8에서만 (GM 출시에서도) iOS 7에서만이 동작을 볼 수 없습니다.

백그라운드 구성으로 NSURLSession을 사용 중입니다. 기본 구성에서는 문제가 없습니다.

"unexpected"NSProgress 개체가 fractionCompleted = 1.0으로 나타나는 이유는 무엇입니까? NSProgress API를 잘못 사용하고 있습니까? iOS 7 및 8에서 매우 다른 동작을 일으키는 원인은 무엇입니까?

샘플 코드는 여기에 있습니다 : 사전에 어떤 도움 https://s3-eu-west-1.amazonaws.com/pg.test/pubtest/NSProgress-20140830.zip

감사합니다.

답변

3

진행 상황을 업로드 할 때 동일한 문제가 발생했습니다. 이미 말했듯이, 작업을 생성하라는 호출이 현재 진행 상황에 바인딩되어 즉시 완료되는 NSProgress 객체를 만드는 것 같습니다.

uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; 

이로 인해 전반적인 진행 과정에서 문제가 발생했습니다. AFNetworking 포크에서 블록을 통해 NSProgress를 생성하는 콜백을 만들 수있는 해결 방법을 만들었습니다. AFURLSessionManager의 메소드가 진행 출력 매개 변수가 아닌 진행 작성 블록을 갖도록 업데이트되었습니다.

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
            fromFile:(NSURL *)fileURL 
           progress:(NSProgress *(^)(int64_t totalUnitCount))progressCreationBlock 
          completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler 

이 단지 "진행"블록에서 만든 진행 개체가 현재 진행에 직접 아이, 세션을 생성에서없는 진행으로 추가됩니다 것을 보장. 이 아이폰 OS 8에서 버그가 있다면 분명 아니에요

progress:^NSProgress *(int64_t totalUnitCount) { 
    [currentProgress becomeCurrentWithPendingUnitCount:1]; 

    NSProgress *progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; 

    [currentProgress resignCurrent]; 

    return progress; 
} 

https://github.com/cgreen-mmf/AFNetworking/commit/a0703a4f82a47e6c56c11245e4d88846ffbd0b28

또는이 의도 된 행동 인 경우 : 호출 수신자로부터 블록의 구현은 다음과 같이 보일 것입니다.