2013-10-01 4 views
12

현재 응용 프로그램에서 여러 이미지를 서버에 업로드하기위한 시스템을 설계하고 있습니다. 파일은 로컬 장치에 저장되며 현재 아이디어는 파일을 청크로 분할 한 다음 청크별로 서버에 업로드하여 다음 메시지를 업로드하기 전에 성공 메시지를 기다립니다.iOS 7 - NSURLSession 재개 가능한 업로드

이 프로세스는 사용자가 원활하게 수행해야하며 버튼을 눌러 모든 이미지를 제출 한 다음 애플리케이션을 닫고 백그라운드에서 계속 진행할 수 있어야합니다. iOS 7에서는 새로운 NSURLSession API에 업로드를 전달하고 애플리케이션과 독립적으로 업로드 작업을 처리 할 수 ​​있음을 확인했습니다.

누군가이 전송이 얼마나 안정적인지 알고 있는지 궁금합니다. 전체 이미지를 전달하면 인터넷 연결이 절반 정도 떨어진다면 어떻게됩니까? 배경 전송 서비스가 나중에 다시 시도합니까? 아이디어는 우리가 이미지를 업로드 할 수 있고, 반쯤 실패한 경우 나중에 연결이 다시 시작될 때까지 계속 진행할 수 있다는 것입니다.

우리가 생각한 한 가지 아이디어는 파일을 청크로 분할 한 다음 모든 청크를 별도의 NSURLSessionUploadTasks로 전달하여 결국 모든 서버에 전송한다고 가정합니다.

uploadTaskWithRequest:fromData:completionHandler: 

그리고 다음 completitionHandler에서 다음 다음 청크를 보낼 :

또 다른

을 사용하여 첫 번째 덩어리를 보낼 수 있었다. 이 나의 문제는 백그라운드에서 다음 청크가

@property BOOL discretionary = true 

있을 것이다 경우에 연결하는 경우에만 무선 랜을 통해 전송된다는 것을 의미하는 것입니다. 나는 모든 네트워크를 통해 작업하고 대처 할 수 있도록이 필요 interuptions.

코드를 원하지 않습니다.이 문제를 해결하는 올바른 방법이 있다면 조언하십시오.

답변

7

나는 앱이 백그라운드에서 시작해야 오류로 인해 질문

업로드가 중간에 중단하면

을의 일부를 대답하려고 것이다 당신이 필요한 오류 처리를 수행 할 수 있어야합니다. 귀하의 서버에서 재개 가능한 업로드를 지원한다면 오프셋을 가져 와서 다음 청크를 업로드 할 다른 작업을 설정할 수 있어야합니다.

백그라운드에서 실행되도록 구성된 NSURLSession을 사용하는 경우 은 완료 핸들러로 업로드 작업을 설정할 수 없으며 NSData 개체를 사용하여 청크를 업로드 할 수 없습니다. 귀하의 유일한 옵션은 디스크에 청크를 작성하고 다음 나는있는 NSData 객체는 응용 프로그램 메모리에 상주하며 단지에서 오른쪽 될 수 있도록 배경 업로드가 외부 데몬에 의해 수행되기 때문에이 말이 생각

uploadTaskWithRequest:fromFile: 

을 사용하는 것입니다 파일 업로드 (사용자의 샌드 박스에서). 또한 완료 핸들러를 사용하는 대신 콜백을 수신하기 위해 대리인을 사용해야합니다 (앱이 포 그라운드에있는 동안). 당신은 여전히있는 NSData 객체를 사용하는 것을 선호하는 경우

, 다음 대체 솔루션은

downloadTaskWithRequest: 

당신이 요청의 본문에있는 NSData 객체를 설정하고 함께 전달할 수있는이 방법을 사용하여 작업을 생성하는 것입니다 이를 위해 NSURLMutableRequest를 사용하여 요청을 설정해야합니다.

임의 속성의 경우 기본값이 TRUE로 설정되어 있기 때문에 이에 대해 많은 것을 할 수 있을지 확실하지 않습니다. 그것은 전송이 일 가능성이 높습니다. Wi-Fi에 연결될 때이 발생하고 휴대 전화를 통해 발생할 수있는 작은 기회가있을 수 있지만 내 생각에는 받아들이지 않을 것입니다.

+0

위임자를 사용 중이면 이전 사진을 업로드 할 때 완성 델리게이트 콜백에서 다음 사진 업로드 작업을 대기시킬 수 있습니다. 그 맞습니까? -thanks –

+0

네 말이 맞아. 너 그렇게 할 수있어. –

+2

@ErbenMo 그래도주의해야합니다. 앱이 백그라운드에있는 동안 백그라운드 전송이 시작되면 구성 객체의 임의 속성이 true로 처리됩니다. 이 플래그가 설정되면 전원이 연결되고 Wi-Fi에 연결될 때 전송이 발생할 가능성이 더 높습니다. 이 값은 기본적으로 false입니다. 응용 프로그램이 백그라운드에있는 동안 작업이 시작된 경우이 작업의 실제 값에 관계없이 임의로 true로 처리됩니다. 따라서 WiFi에 연결되어있을 때까지 다음 업로드가 이루어지지 않을 수 있습니다. –

관련 문제