2016-09-22 3 views
0

NSURLSession을 사용하여 많은 파일을 다운로드해야하는 유스 케이스가 있습니다.비동기 작업을위한 내부 루틴 사용하기

세션 시간 제한을 유지하려면 작업 대기열에 넣고 동시 다운로드 수를 제한하여 굶주 리지 않도록해야합니다.

제 아이디어는 작업 재개를 nsoperation으로로드하고 동시 활성 수를 제한하는 nsoperationqueue로로드한다는 것입니다.

문제는 내가 [작업 재개]를 호출 할 때 코드가 종료되고 파일 다운로드가 완료 될 때까지 기다렸지 만 nsoperation이 완료된 것으로 간주된다는 것입니다.

다음은 몇 가지 코드입니다.

NSURLSessionDownloadTask *task = [session downloadTaskWithRequest: request 
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { 

    //move the file to a permanent location 

    CFRunLoopStop(CFRunLoopGetCurrent()); 
} 
//I have instantiated a class global NSOperation queue. 
[imageDownloadQueue addOperationWithBlock:^void() { 
    [task resume]; 
    CFRunLoopRun(); 
}]; 

어떻게 콜백을 기다리는 동안 nsoperation 스레드를 활성 상태로 유지할 수 있습니까? 또한 nsrunloop을 사용하고 NSMachPort에 포트를 추가하려고했습니다. 그것은 도움이되지 않았다.

또한 작업을 다시 시작하면 제한 시간 타이머가 시작되기 때문에 NSURLSession에서 HttpMaximumConnectionsPerHost를 설정해도 도움이되지 않습니다. 즉, 이전보다 시간 초과가 더 많이 걸릴 것입니다.

+1

이러한 문제를 광범위하게 다루는 https://developer.apple.com/videos/play/wwdc2015/226/ (WWDC 2015 Advanced NSOperations)를 참조하십시오. 1 년 후, 나는 Dave DeLong에게 그가 여전히 그들이 일하고 있다고 생각하는지 알아보기 위해 이러한 패턴에 대해 도전했다. 그는 계속해서 매우 성공적이라고 말했습니다. –

+0

좋은 동영상 이었지만 패턴을 다시 쓸 시간이 없습니다. 그것은 이보다 더 복잡한 코드입니다. 난 그냥 스레드가 살아 있고 콜백 자체를 제거하는 방법을 원한다. – mac10688

+0

이것은 비동기 NSOperations의 용도입니다. 커스텀'NSOperation'을 만들고,'isAsynchronous'에'true'를 반환하고,'main()'대신에'start()'를 오버라이드합니다. 적절한 시간에 (즉, 작업이 완료되었을 때)'isExecuting'과'isFinished'를 수동으로 설정해야합니다. 당신은 "스레드 살아 남아 싶지 않아요." 정확한 시간에 작업이 완료되도록 표시하려고합니다. 이것이 비동기식 작동 방식입니다. 단지 main()이 돌아올 때가 아니라 손으로 직접하는 것을 의미합니다. –

답변

1

슬프게도, 나는 적절한 수정을위한 시간이 없었고, 최대한 빨리 수정 된 시간 초과 문제가 필요했습니다. 나는 일하는 것을 발견했다.

//I have instantiated a class global NSOperation queue. 
[imageDownloadQueue addOperationWithBlock:^void() { 
    [task resume]; 
    while(task.state == NSURLSessionTaskStateRunning) 
    { 
     [NSThread sleepForTimeInterval:.1]; 
    } 
    }]; 

NSOperation은 백그라운드 스레드에서 작동하므로 작업이 실행되는 동안 해당 스레드를 잠자기 할 수있었습니다. 이것은 쓰레드가 죽어가는 것을 막아 주지만, 태스크는 자신의 쓰레드에서 실행되고 차단되지 않습니다.

관련 문제