2017-05-09 4 views
0

나는 성공적 IOS (10) 내 응용 프로그램 코드를 백그라운드에서 zip 파일을 다운로드 할 수 있습니다 및 신속한 3.신속한 3 urlsession에 속성을 전달하는 방법 didFinishDownloading 배경 다운로드 후 위임 하시겠습니까?

은 내가 backgroundsession 데이터 작업 사용

let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix)) 
     let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main) 

     var request = URLRequest(url: dlUrl) 
     request.httpMethod = "GET" 
     request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData 

     let task = backgroundSession.downloadTask(with: request) 

     task.resume() 

을하지만 전달하는 가장 좋은 방법은 무엇인지 궁금합니다 다운로드가 끝나면 델리게이트 메소드의 특정 메타 데이터 :

func urlSession(_ session: URLSession, 
    downloadTask: URLSessionDownloadTask, 
    didFinishDownloadingTo location: URL){ 

나는이 델리게이트 내부에서 다운로드에 대한 정보를 필요로한다. 이전에 사용자가 선택한 항목 서버 또는 URL에서이 데이터를 가져올 수 없습니다.

그래서

if downloadType == "normal" ... do this 
else ... do that 

내가 안전하게 속성을 사용할 수 있는지 모르겠습니다 변수 또는 사전 downloadType가 대리인이 뭔가를 가지고, 완성 된 다운로드와 함께 무엇을 나에게 말하고 싶은 앱이 일시 중지 된 동안 URLSessionDownloadDelegate 프로토콜을 구현하는 클래스의 앱이 일시 중지 된 상태에서 다운로드가 완료되거나 클래스의 새 인스턴스를 만들 때 클래스 인스턴스 자체가 복원됩니까?

그래서이 항상 작동합니다

class ServerCom: NSObject, URLSessionDownloadDelegate { 
    var updateTypeStr = "" 
    [...] 
    func somePublic(setUpdateType: String) { 
    self.updateTypeStr = setUpdateType 

    [...] 
    func urlSession(_ session: URLSession, 
    downloadTask: URLSessionDownloadTask, 
    didFinishDownloadingTo location: URL){ 
    [...] 

     if(self.updateTypeStr == "normal") { // do this 
     else { // do that 

그 사용 사례에 대한 몇 가지 더 나은 방법이 있습니까?

미리 감사드립니다.

답변

1

앱이 일시 중지 된 동안 다운로드가 완료되거나 클래스의 새 인스턴스를 만들 때 클래스 인스턴스 자체가 복원됩니까?

귀하가 직접 저장하고 복원해야합니다.

데몬이 백그라운드 요청을 완료하는 동안 앱이 완전히 중단 될 수 있습니다 (예 : 일시 중지되었거나 메모리 부족으로 인해 버려 질 수 있음). 따라서 데몬이 백그라운드 요청을 완료하는 동안 앱이 완전히 종료 될 수 있습니다. 영구 저장 장치가 필요하며 앱이 다시 시작될 때 저장소에서이를로드 할 수 있어야합니다.

백그라운드 세션으로 앱을 테스트 할 때 exit(0)을 호출하는 코드를 사용하면 앱을 종료하는 것이 좋습니다. 프로덕션 앱에서는이 작업을 수행하지 않지만 백그라운드 요청이 완료되면 앱을 다시 시작할 때 필요한 객체를 다시 만들 수있는 앱의 기능을 테스트 할 때 유용합니다. 요점은이 테스트를 수행 할 때 앱을 죽이기 위해 "더블 탭 홈 버튼을 사용하고 스 와이프 업"하지 말아야한다는 것입니다. 이는 의도적으로 백그라운드 요청을 취소하기 때문입니다. 백그라운드 앱 요청이 완료되면 앱이 정상적인 앱 수명주기 동안 종료되었고 네트워크 데몬에 의해 재시작되는 시나리오를 테스트하려고합니다.