Streaming von NSXMLParser mit NSInputStream

9

Aktualisierung:

Bei der Verwendung der NSXMLParser -Klassenmethode initWithContentsOfURL anstelle des Parsings beim Herunterladen des XML-Feeds scheint es so zu sein, dass versucht wird, die gesamte XML-Datei in den Speicher zu laden und erst dann den Analyseprozess zu starten. Dies ist problematisch, wenn der XML-Feed groß ist (eine übermäßige Menge an RAM zu verwenden, inhärent ineffizient, weil das Parsing nicht parallel zum Download erfolgt, sondern erst nach dem Download gestartet wird).

Hat jemand herausgefunden, wie man analysiert, wenn der Feed mit NSXMLParser auf das Gerät gestreamt wird? Ja, Sie können LibXML2 verwenden (wie unten beschrieben), aber es scheint, als ob es möglich wäre, dies mit NSXMLParser zu tun. Aber es entzieht sich mir.

Ursprüngliche Frage:

Ich habe mit der Verwendung von NSXMLParser gerungen. um XML aus einem Webstream zu lesen. Wenn Sie initWithContentsOfURL , während die Schnittstelle zu der Schlussfolgerung führt, dass die XML-Datei aus dem Internet gestreamt wird, scheint sie dies nicht zu tun, sondern versucht anscheinend, die gesamte Datei zu laden XML-Datei zuerst, bevor ein Parsing stattfindet. Für bescheidene XML-Dateien ist das in Ordnung, aber für wirklich große, das ist problematisch.

Ich habe Diskussionen über die Verwendung von NSXMLParser in Verbindung mit initWithStream mit einigen angepassten NSInputStream , die aus dem Internet streamen. Zum Beispiel gab es Antworten darauf, die vorschlagen, etwas wie das CFStreamCreateBoundPair zu verwenden, auf das im folgenden Cocoa Builder-Beitrag und die Diskussion von Einrichten von Socket-Streams im Apple Stream-Programmierhandbuch , aber ich habe es nicht zum Laufen gebracht. Ich habe sogar versucht, meine eigene Unterklasse NSInputStream zu schreiben, die eine NSURLConnection (was selbst ziemlich gut im Streaming ist), aber ich konnte es nicht zusammen mit NSXMLParser zum Laufen bringen.

Am Ende entschied ich mich dafür, LibXML2 anstatt NSXMLParser zu verwenden, wie im Apple XMLPerformance-Beispiel , aber ich habe mich gefragt, ob jemand Glück gehabt hat, von einer Webquelle zu streamen mit NSXMLParser . Ich habe eine Menge "theoretisch gesehen, konnte man x " Antworten machen, was alles von CFStreamCreateBoundPair bis zum HTTPBodyStream von %Co_de% , aber ich habe noch eine funktionierende Demonstration von Streaming mit NSURLRequest .

Der Ray Wenderlich Artikel How To Choose Der beste XML-Parser für Ihr iPhone-Projekt scheint zu bestätigen, dass NSXMLParser nicht für große XML-Dateien geeignet ist, aber mit allen Posts zu möglichen NSXMLParser -basierten Umgehungen für das Streamen wirklich großer XML-Dateien Ich bin überrascht, dass ich noch eine funktionierende Demonstration davon finden muss. Kennt jemand eine funktionierende NSXMLParser Implementierung, die aus dem Internet streamt? Klar, ich kann einfach bei NSXMLParser oder einem anderen äquivalenten XML-Parser bleiben, aber der Gedanke, mit LibXML2 zu streamen, scheint sehr nah zu sein.

    
Rob 06.12.2012, 09:02
quelle

1 Antwort

4

-[NSXMLParser initWithStream:] ist die einzige Schnittstelle zu NSXMLParser , die derzeit eine Streaming-Analyse der Daten durchführt. Die Verbindung zu einem asynchronen NSURLConnection , das Daten inkrementell bereitstellt, ist schwer zu handhaben, da NSXMLParser eine blockierende, "Pull" -basierte Methode zum Lesen von NSInputStream verwendet. Das heißt, -[NSXMLParser parse] verhält sich bei einem NSInputStream wie folgt:

%Vor%

Um diesem Parser inkrementell Daten zur Verfügung zu stellen, wird eine benutzerdefinierte NSInputStream Unterklasse benötigt, die Daten, die von den NSURLConnectionDelegate Aufrufen in einer Hintergrundwarteschlange empfangen werden, an den -read:maxLength: Aufruf weiterleitet, auf dem NSXMLParser wartet .

Es folgt eine Proof-of-Concept-Implementierung:

%Vor%     
bdash 26.01.2013, 20:06
quelle

Tags und Links