2017-09-04 5 views
0

저는 Xamarin.iOS와 협력하여 Downloadmanager를 구현하고 있습니다.Xamarin.iOS 다운로드 관리자

신속하게 DownloadManager를 구현하는 방법에 대한 자습서를 찾았습니다. 자습서를 통해 신속하게 C#으로 작성된 논리를 복사했습니다. DownloadManager는 작업을 처리하고 대기열에 넣고 실행합니다. 내가 직면하고있는 유일한 문제는 일시 중지 모드로의 앱 전환입니다. 큐의 동작은 결정적이지 않습니다. 때로는 대기중인 작업이 모두 실행되고 때로는 앱이 실행을 중지하는 경우가 있습니다.

사용 사례 1 : 파일 동기화를 시작하고 iPad를 잠급니다. 대부분 대기중인 작업이 실행됩니다. 하지만 때로는 내가 iPad의 잠금을 해제하면 응용 프로그램이 백그라운드로 전송되며 응용 프로그램으로 돌아가려면 홈 버튼을 두 번 눌러야합니다.이 경우 파일 동기화가 실행 중간에 중단되었습니다.

사례 2 : 파일 동기화를 시작하고 배경으로 앱을 보냅니다. 앞의 사용 예제와 같은 동작. 때로는 모든 작업이 실행되고 때로는 작업이 중지되는 경우도 있습니다.

사례 3 : 고객이 동기화를 시작하고 잠시 후 동기화가 완료되지 않고 응용 프로그램이 백그라운드에서 iPad를 자동으로 나가게합니다. 평균 약 70 %의 동기화가 수행됩니다.

구현을 위해 "DownloadOperation"을 요소로 사용하는 "NSOperationQueue"를 사용했습니다. "DownloadOperation"은 "비동기"로 설정된 실행을 가진 NSOperation 객체의 래핑 된 것입니다.

가능한 질문

  • 나는 응용 프로그램이 상태를 변경할 때 "NSOperationQueue"어떻게되는지 확실하지 않다?
  • "NSOperationQueue"의 사용법은 DownloadManager의 구현과 관련된 "올바른"방법입니까?
  • 토론을 기대하겠습니다은 "NSOperationQueue"및/또는 "NSOperation"

의 실행의 최적화에 대한 일반적인 팁이있다.

P. "배경 모드"와 "배경 가져 오기"를 활성화했습니다

+0

취소 트리거가 필요하다고 생각합니다. 작업에 대해서는이 작업을 수행 할 수 있지만 NSOperationQueues에 대해서는 확실하지 않습니다. cancallation trigger를 구현하는 것이 가능하다면, 작업이 멈추는 지, 그리고 app reload가 그것을 처리 할 수 ​​있는지 알 수 있습니다. – Digitalsa1nt

+0

@ Digitalsa1nt 작업을 취소하고 싶지 않습니다. 응용 프로그램이 종료 된 후에도 작업을 계속하기를 원합니다. 이것이 NSOperations와 함께 OperationQueue 및 NSUrlSession을 사용하는 이유입니다. 그러나 누군가 당신의 문제에 대한 단서를 가지기를 바랍니다. –

+0

iOS가 애플리케이션을 종료 한 후에도 코드가 계속 실행되지 않도록 할 수 있습니다. 사과 지침에 위배된다고 말해야합니까? 희망을 갖고 누군가가 당신을 위해 일을 찾을 수 있기를 바랍니다. :) – Digitalsa1nt

답변

0

설명에 따르면 NSURLConnection을 사용하여 더 이상 사용되지 않는 백그라운드 다운로드를 실행한다고 가정합니다. 또한, Background Fetch는 적은 양의 내용입니다 그것은 시나리오에 적합하지 않은, 기회 주의적으로 활성화됩니다 :

내용의 적은 양의 새로운 콘텐츠를 확인해야하는 기회 주의적

앱을 가져 오기 주기적으로 시스템에 깨어나서 해당 콘텐츠에 대한 가져 오기 작업을 시작할 수 있도록 요청할 수 있습니다.

그래서, 당신은 공식적으로 백그라운드에서 콘텐츠를 다운로드하는 것이 좋습니다 NSURLSession를 사용하도록 전환 할 수있다.백그라운드 세션을 구성하려면 앱이 일시 중지되거나 해지되는 경우 (사용자가 앱을 강요한 경우 제외) 다운로드 프로세스가 계속 진행됩니다. 이 Apple documentation를 참조 : 시스템이 경우 다운로드 프로세스를 제어 할 수 있도록 파일을 다운로드 할 때 배경

에서 콘텐츠를 다운로드

이 앱이 다운로드를 시작하기 위해 NSURLSession 객체를 사용한다 앱이 일시 중지되거나 종료됩니다. 백그라운드 전송을 위해 NSURLSession 객체를 구성하면 시스템에서 이러한 전송을 별도의 프로세스로 관리하고 정상적인 방법으로 상태를 다시 앱에보고합니다. 전송이 진행되는 동안 앱이 종료되면 시스템은 백그라운드에서 전송을 계속하고 전송이 완료되거나 하나 이상의 작업에 앱의주의가 필요할 때 앱을 시작합니다 (적절한 경우). 작업이 아직 완료하지 않은 시스템 앱을 종료하는 경우

...

시스템이 자동으로 백그라운드에서 작업을 관리하고 있습니다. 사용자가 앱을 종료하면 보류중인 모든 작업이 취소됩니다. 신속한와

블로그 : NSURLSession를 통해 배경 다운로드 관리자를 만드는 방법에 대한

, 당신은 참조 할 수 Downloading files in background with URLSessionDownloadTask

자 마린은 안내 : Walkthrough - Using Background Transfer Service and NSURLSession

을 당신이 다운로드 할 필요가 있다고 생각 백그라운드에 여러 파일이 있다면 여기에 좋은 안내서가 있습니다 : Downloading multiple files in batches in iOS .

+0

"NSURLSession"으로 전체 관리자를 구현했습니다. 간단히 말해 NSOperationQueue를 NSOperations로 만들고 각 작업에는 DownloadManager의 기본 NSURLSession에 의해 생성 된 NSURLSessionDownloadTask가 있습니다. 앱이 일시 중지 된 경우에도 여러 파일을 다운로드 할 수 있어야합니다. 이 게시물을 참조로 사용했습니다. -> [링크] (https://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession-downloadtask-in-s) –

관련 문제