Strumieniowanie NSXMLParser z NSInputStream

Aktualizacja:

Podczas używaniaNSXMLParser metoda klasyinitWithContentsOfURLzamiast analizować podczas pobierania pliku XML, wydaje się, że próbuje załadować cały plik XML do pamięci i dopiero wtedy inicjuje proces analizowania. Jest to problematyczne, jeśli kanał XML jest duży (przy użyciu nadmiernej ilości pamięci RAM, z natury nieefektywnej, ponieważ zamiast analizować równolegle z pobieraniem, rozpoczyna analizowanie dopiero po zakończeniu pobierania itp.).

Czy ktoś odkrył, jak analizować, gdy kanał jest przesyłany strumieniowo do urządzenia za pomocąNSXMLParser? Tak, możesz użyćLibXML2 (jak omówiono poniżej), ale wygląda na to, że powinno być możliweNSXMLParser. Ale to mi umyka.

Oryginalne pytanie:

Zmagałem się z używaniemNSXMLParser odczytać XML ze strumienia internetowego. Jeśli użyjeszinitWithContentsOfURL, podczas gdy interfejs może doprowadzić do wniosku, że będzie on przesyłać strumieniowo XML z sieci, wydaje się, że nie robi tego, ale wydaje się, że próbuje załadować cały plik XML najpierw przed jakimkolwiek analizowaniem. W przypadku plików XML o skromnych rozmiarach jest to w porządku, ale w przypadku dużych plików jest to problematyczne.

Widziałem dyskusje na temat używaniaNSXMLParser w połączeniu zinitWithStream z niektórymi dostosowanymiNSInputStream to jest przesyłane strumieniowo z sieci. Na przykład były na to odpowiedzi sugerujące użycie czegoś takiegoCFStreamCreateBoundPair o których mowa wpo wpisie Cocoa Builder i dyskusja na tematKonfigurowanie strumieni gniazda w ApplePrzewodnik programowania strumieniowego, ale nie udało mi się to uruchomić. Próbowałem nawet napisać własne podklasyNSInputStream które używałyNSURLConnection (co samo w sobie jest całkiem dobre w transmisji strumieniowej), ale nie byłem w stanie uruchomić go w połączeniu zNSXMLParser.

W końcu postanowiłem użyćLibXML2 zamiastNSXMLParser, jak pokazano w ApplePróbka XMLPerformance, ale zastanawiałem się, czy ktokolwiek miał szczęście, że może przesyłać strumieniowo ze źródła internetowego, z którym pracujeNSXMLParser. Widziałem mnóstwo „teoretycznie można to zrobićx„rodzaj odpowiedzi, sugerujący wszystko odCFStreamCreateBoundPair chwycićHTTPBodyStream zNSURLRequest, ale jeszcze nie natknąłem się na roboczą demonstrację przesyłania strumieniowegoNSXMLParser.

Artykuł Raya WenderlichaJak wybrać najlepszy parser XML dla Twojego projektu iPhone'a wydaje się to potwierdzaćNSXMLParser nie nadaje się do dużych plików XML, ale wszystkie posty są możliweNSXMLParseroparte na rozwiązaniach do przesyłania strumieniowego naprawdę dużych plików XML, jestem zaskoczony, że jeszcze nie znalazłem działającej demonstracji tego. Czy ktoś wie o funkcjonowaniuNSXMLParser implementacja, która strumieniuje z sieci? Najwyraźniej mogę się po prostu trzymaćLibXML2 lub inny równoważny parser XML, ale pojęcie przesyłania strumieniowego za pomocąNSXMLParser wydaje się kusząco blisko.

questionAnswers(1)

yourAnswerToTheQuestion