2011-02-11 2 views
3

내가 작업하고있는 프로젝트 (iPhone/Obj-C)에서 대형 포스트잇을 통해 파일을 가져 와서 처리해야합니다. 서버는 BASE64로 인코딩 된 gzipped XML 데이터를 래핑하는 XML을 반환합니다. 예 : 서버 -> XML -> BASE64 -> GZIP -> XML -> 내 모델iOS : 큰 파일을 다운로드, 언랩, 디코딩 및 파싱합니다.

데이터 양은 다양하지만 최종 XML은 약 5MB라고합니다.

도착한대로 데이터의 랩핑, 디코딩 및 구문 분석을하고 싶습니다.

팁/포인터를 찾고 있습니다. (이상적으로는 기존의 게시 된 코드가 있지만 검색 할 때 "스트림 친화적 인"예제가 표시되지 않았습니다.)

결국 NSStream의 서브 클래 싱이 끝나나요?

이상적인 솔루션은 iOS 3.2 이상을 실행하는 기기에서 작동합니다.

감사합니다.

답변

1

서버 (Apache?)가 HTTP 내에서 gzip을 처리하게하고 iOS NSURLConnection이 그대로 gzip을 해제합니다. HTTP에는 바이너리 데이터가 포함될 수 있으므로 Base64는 필요하지 않습니다. XML을 NSURLConnection에 도착하도록 NSData로 가져올 수 있어야합니다.이 파서는 다운로드 할 때 파싱 할 수있는 SAX 형식 파서로 공급할 수 있습니다.

서버가 통제하에 있고 서버가 iOS 앱에서만 사용되고 성능이 가장 중요한 문제인 경우 2 진 plist로 인코딩 된 모델 데이터를 보낼 수 있습니다. 아마도 XML 또는 JSON을 사용하여 작업하기가 더 쉬워 질 것입니다.

+0

제 3 자 서버와 이야기하고 있습니다. 안타깝게도 페이로드에 대해 gzip을 사용하도록 XML을 보낼 수 없습니다. 프로젝트의 또 다른 영역에서 실제적으로 나에게 1-2 라인을 전송합니다.txt 파일을 ZIP 아카이브에 저장합니다. 그래, 와우. – Dave

1

글쎄, 내가 물어 본 질문에 대한 답변이 아니라 "해결책"이라고 할 수 있습니다.

내가 다운로드하는 데이터는 메모리에 잘 맞으므로 스트림으로 처리하기 위해 작업을 최적화 할 필요가 없습니다.

  1. 나는 초기 XML을 가져오고 바로 태그를 잡기 위해 NSXML 파서를 통해 실행 환상적인 ASIHTTPRequest library (벤 Copsey)를 사용합니다. iOS 용 HTTP 프로토콜을 사용하는 모든 사용자에게 ASI-HTTP-REQUEST를 적극 권장합니다.

  2. 다음으로 godip으로 Base64의 포장을 풀기 위해 Matt Gallagher' Base64 category의 약간 수정 (제거 경고) 버전을 사용했습니다.

  3. 그런 다음 ASI의 디코더 인 NSData* xmlData = [ASIDataDecompressor uncompressData:gzippedData error:&error];을 통해 gzip 데이터를 실행하여 함께 보내야하는 XML을 얻습니다.

  4. 마지막으로 XML을 다른 NSXMLParser를 통해 실행하여 필요한 데이터 비트를 선택합니다.

프로젝트의 다른 부분에서 나는 실제로 몇백 개의 작은 .txt 파일을 포함하는 ZIP 아카이브를 가져 오도록 지시하고 있습니다. (예, 그런 종류의 공연입니다.) ZIP 파일을 디코딩하려면; 현재 Karl Moskowski의 ZipKit을 사용하고 있습니다.

데이터가 스트림으로 처리해야하는 지점까지 데이터가 커지지 않기를 바랍니다. 만약 그렇다면, 나는 33 %를 면도하는 쉬운 방법을 안다. :)