3

NSURLConnection를 사용하여, 당신은 NSRunLoop를 사용하여 연결을 예약 할 수있는 옵션을 가지고 있었다 경험은 결코 다운로드의 영향을받지 않았습니다.NSURLSession 및 NSDefaultRunLoopMode

NSURLSession과 비슷한 동작이 발생합니까? 나는 문서를 읽고 성공적으로 세션을 구성하는 다양한 방법을 시도했다.

답변

3

NSURLSession은 "상위"레벨에서 작동하며 NSURLConnection을 사용하는 것보다 개발자가 더 간단하게 만듭니다.
몇 가지 테스트를했는데 runloop과 모드를 제어 할 수있는 가능성이 없다고 생각합니다. NSURLSession은 외부 데몬이 관리하는 것으로 보이고 앱이 아닌 것 같습니다 (NSURLSessionDownloadTask으로 만 테스트했습니다).
이 간단한 테스트를 수행합니다

  1. 다운로드 및 this Github project
  2. 이 다운로드
  3. 일시 정지
  4. 가 대기 응용 프로그램의 상태를 볼 수
  5. 는 "다운로드"를 열고 다운로드를 컨트롤러를 시작 실행 순간
  6. 앱 일시 중지

앱이 일시 중지 된 상태에서 다운로드가 계속되는 것을 볼 수 있습니다. 따라서 NSURLSession을 시작할 때 컨트롤은 앱 외부의 시스템으로 전달됩니다. 이는 앱의 주요 부분이 내부 런 루프.

사용자가 제어 할 수있는 유일한 기능은 대리자 호출이 전달되는 (응용 프로그램으로 전달되는) 연속 대기열입니다. NSOperationQueue Grand Central Dispatch를 사용하여 호출을 대기열에 넣기 때문에 대리자 호출이 실행 대기열에 있습니다 (기본 스레드 또는 백그라운드 스레드에서 선택할 수 있음).이 호출에 사용 된 runloop 모드는 확실하지 않지만 이것은 당신의 연구를 계속하는 좋은 출발점입니다.

편집 : 올바르게 기억하면 백그라운드 스레드에 대한 호출은 runloop이 실행되지 않는 스레드에서 수행됩니다. 이 라인 이전 프로젝트의 FLDownloader 클래스의 위임 방법 중 하나에

NSLog(@"%@", [[NSRunLoop currentRunLoop] currentMode]); 

를 추가 할 경우 runloop가없는 경우 사실, 당신은 이런 (전무)에는 실행 모드가없는 것을 볼 수 달리는.

+0

작업을 오프 프로세스로 관리하는 백그라운드 세션 구성을 사용하고 있습니다. 비 백그라운드 세션은 앱이 관리하는 스레드에서 작동합니다. 나는 내가 원하는 것을 할 수 없다는 데 동의한다. – Gadd

+0

나는 이것에 대해 잘 모르겠다. 그러나 나는 그 논쟁에 대해 궁금해했고 약간의 연구를했다.새로 생성 된 NSURLSession (백그라운드가 아님)의 전체 스택 추적을 분석하면 runloops에 속하는 메소드 호출이 있습니다. 예를 들어,'[NSURLConnection, _resourceLoadLoop :]'및'[NSURLConnection, resourceLoaderRunLoop]'. 나는 두 번째를 뒤집어 썼다. 반환 값으로 CFRunLoop 객체에 액세스했다. NSURLSession의 모드를 변경하려고 시도 할 수 있습니다 (NSURLSession이 kCFRunLoopDefaultMode를 사용하는 것 같습니다). – LombaX

+0

흥미롭게도, trace에서 resourceLoadLoop을 보았지만 더 자세히 살펴 보지 않았습니다. 나는 해킹을하고 싶지 않지만, 지원되지 않는다면 기본 모드에서 실행되는 표준 동작을 고수 할 것입니다. – Gadd

0

누구든지이 문제가 다시 발생하면. 다운로드 작업을 다른 실행 루프로 예약 할 수는 없지만 스크롤 할 때 성능을 크게 향상시키는 다른 실행 루프 모드로 응답을 처리 할 수 ​​있습니다.

[self performSelectorOnMainThread:@selector(requestDidFinishLoadingWithData:) 
         withObject:data 
        waitUntilDone:YES 
          modes:@[NSDefaultRunLoopMode]]; 
관련 문제