2017-03-28 15 views
0

나는 그림을 서버에 업로드하기 위해 URLSessionDataDelegate을 가지고 있으며, 다음은 그것의 일부이다.Swift : 다른 URLSession이 초기화 될 때 URLSession을 초기화하지 않는 방법은 무엇입니까?

URLSession은 업로드 할 이미지를 선택하면 바로 초기화됩니다.

그러나 사용자가 Upload 버튼을 탭하고 no internet connection이 있으면 이미지를 영역에 저장하고 다음에 앱을 실행할 때 업로드합니다.

저장된 이미지를 업로드 할 때 나는 거의 동일한 코드의 OfflinePictureUploadClass이라는 다른 클래스를 만들었습니다.

앱을 스 와이프하여 종료 한 다음 다시 시작한 경우 올바른 URLSessionDataDelegate 메서드가 OfflinePictureUploadClass으로 실행되고 있습니다. 따라서이 경우 아무런 문제가 없습니다.

그러나 응용 프로그램이 완전히 닫히지 않고 정상적으로 다시 실행되면 기본 PictureUpload 클래스의 대리자 메서드가 실행되고 업로드가 실패합니다.

이렇게 어떻게 극복 할 수 있습니까? 이미지를 선택하면 초기화되는 URLSessionDataDelegate을 어떻게 초기화 해제합니까?

아래 코드는 이미지를 선택할 때 초기화되는 것을 보여줍니다.

fileprivate var DefaultSession: Foundation.URLSession! 
fileprivate var BackgroundSession: Foundation.URLSession! 

override init() { 
    super.init() 
    // default session to fetch 
    let config = URLSessionConfiguration.default 
    config.timeoutIntervalForRequest = 20 
    DefaultSession = Foundation.URLSession(configuration: config, delegate: nil, delegateQueue: .main) 
    // background session 
    let backgroundConfiguration = "com.xxx.backgroundconfiguration.upload" 
    let configuration = URLSessionConfiguration.background(withIdentifier: backgroundConfiguration) 
    BackgroundSession = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: .main) 
} 

답변

0

이 기본 개념은 프로그램이 백그라운드 모드를 지원하므로 연결을 올바르게 지원해야한다는 것입니다. 백그라운드에서 일정한 시간이 지나면 프로그램이 일시 중지 모드로 전환된다는 것을 알고 있습니다. 따라서 앱이 백그라운드로 갈 때마다 시스템에서 추가 시간을 요청하고 앱이 백그라운드에서 실행되어 모든 연결을 완료하거나 닫을 시간을 확인할 수 있습니다. 이러한 방법을 확인하십시오 앱이 일시 중단 후 깨어 나면

begin​Background​Task(with​Name:​expiration​Handler:​)

background​Time​Remaining

문제는, 그것이 정지 같은 지점에서 정확하게 계속됩니다. 따라서 세션 또는 연결 시간 초과와 같은 모든 종류의 오류를 얻을 수 있습니다.

+0

감사합니다. 나는 내 질문으로 더 명확하게하려고 노력한다. 이미지를 선택하면 PictureUpload 클래스가 초기화됩니다. 다음 화면에서 사용자가 인터넷 업로드를 탭하면 연결이없는 경우 이미지가 저장되고 나중에 연결되면 업로드됩니다. 문제는 앱이 백그라운드로 이동하고 완전히 닫히지 않은 경우입니다. 인터넷이 활성화되어 있고 응용 프로그램이 다시 시작되면 PictureUpload의 대리자 메소드가 실행됩니다. OfflinePictureUpload 클래스를 실행하는 것으로 시작한 다음 Delegate를 실행해야하는 경우 PictureUpload 클래스로 이동합니다. – Ananth

+0

고마워. 나는 그것을 할 수 있었다. 배경 식별자를 변경했습니다. 나는 두 URLTask가 동일한 배경 식별자를 가지고 있다는 것을 알아 차렸다. 그래서 식별자를 바꾸는 것이 트릭을 만들었습니다. – Ananth