Streaming NSXMLParser com NSInputStream
Atualizar:
Ao usarNSXMLParser
método de classeinitWithContentsOfURL
Em vez de analisar à medida que o feed XML é baixado, ele parece tentar carregar todo o arquivo XML na memória e só então iniciar o processo de análise. Isso é problemático se o feed XML for grande (usando uma quantidade excessiva de RAM, inerentemente ineficiente porque, em vez de analisar em paralelo com o download, ele só inicia a análise quando o download é feito etc.).
Alguém descobriu como analisar como o feed está sendo transmitido para o dispositivo usandoNSXMLParser
? Sim, você pode usarLibXML2
(como discutido abaixo), mas parece que deve ser possível fazê-lo comNSXMLParser
. Mas está me escapando.
Pergunta original:
Eu estava lutando com o usoNSXMLParser
para ler XML de um fluxo da web. Se você usarinitWithContentsOfURL
, enquanto a interface pode levar alguém a inferir que iria transmitir o XML da web, parece não fazê-lo, mas parece tentar carregar o arquivo XML inteiro antes de qualquer análise ocorrer. Para arquivos XML de tamanho modesto, tudo bem, mas para arquivos realmente grandes, isso é problemático.
Eu tenho visto discussões sobre o usoNSXMLParser
em conjunção cominitWithStream
com alguns personalizadosNSInputStream
que está fluindo da web. Por exemplo, tem havido respostas para isso que sugerem usar algo como oCFStreamCreateBoundPair
referido noseguinte postagem do Cocoa Builder e a discussão deConfigurando fluxos de soquete na maçãGuia de Programação de Fluxo, mas não consegui que funcionasse. Eu até tentei escrever meu próprio subclasseNSInputStream
que usou umNSURLConnection
(que é, em si, muito bom em streaming), mas eu não era capaz de fazê-lo funcionar em conjunto comNSXMLParser
.
No final, decidi usarLibXML2
ao invés deNSXMLParser
, como demonstrado na AppleAmostra XMLPerformance, mas eu queria saber se alguém teve alguma sorte recebendo streaming de uma fonte da web que trabalha comNSXMLParser
. Eu já vi muita "teoricamente você poderia fazerx"tipo de respostas, sugerindo tudo, desdeCFStreamCreateBoundPair
para pegar oHTTPBodyStream
deNSURLRequest
, mas eu ainda não encontrei uma demonstração de streaming comNSXMLParser
.
O artigo de Ray WenderlichComo escolher o melhor analisador XML para o seu projeto do iPhone parece confirmar queNSXMLParser
não é adequado para grandes arquivos XML, mas com todos os posts sobre possíveisNSXMLParser
com base em soluções para streaming de arquivos XML realmente grandes, estou surpreso por ainda não ter encontrado uma demonstração funcional disso. Alguém sabe de um funcionamentoNSXMLParser
implementação que flui da web? Claramente, eu posso ficar comLibXML2
ou algum outro analisador XML equivalente, mas a noção de streaming comNSXMLParser
parece tantilizingly perto.