2009-04-29 6 views
0

Ich bin für diejenigen von Ihnen, die neugierig apps iPhone Aufbau basierten auf REST/SOAP/XML-RPC oder einfach nach unten zieht einen dynamischen XML-Feed, was bedeutet es genau zu Ihnen, wenn ein Benutzer den Feed "Aktualisieren" sagt?„Refreshing“ ein XML-Feed auf dem iPhone/Mac OSX

Der gerade Weg nach vorn ist eine Sammlung zu füllen, sagt einen NSMutableArray, mit dem, was man aus dem Futter bringen. Wenn ein Widget auf der Benutzeroberfläche zu aktualisieren verfügbar ist, kann ich normalerweise so etwas wie:

[myMutableArray removeAllObjects]; 
// follow steps to repopulate myMutableArray 

Es scheint dies die am wenigsten effizienten Algorithmus ist eine XML-Feed zum Auffrischen. Zum Beispiel fügen viele Leute, die Twitter-Clients aufbauen, Änderungen an ihrem bestehenden Feed an, anstatt den gesamten Feed in seiner vollständigen Form wieder herunter zu bringen.

Welche Algorithmen werden Sie Ihre Modelle beim Sprechen auf eine serverseitigen Datenquelle zu „aktualisieren“ verwenden?

Vielen Dank.

Antwort

4

Sie in mit dem PubSub Rahmen aussehen sollte, wenn man OS X 10.5 benötigen können. Es wurde speziell zum Abrufen und Aktualisieren von RSS/Atom-Feeds entwickelt.

(Disclaimer: Ich schrieb eine Menge dieses Rahmens, während ich bei Apple war :)

Die Antwort auf Ihre Frage ist, dass RSS-Feeds von Natur aus ineffizient ist. Sie können dies minimieren, indem

  1. HTTP mit „conditional GETs“, also wenn der Vorschub auf dem Server nicht geändert hat gerade Sie bekommen wieder eine winzige 304 Antwort. Dies spart Zeit für den Server und für Sie. (Einige Feed-Server, wie slashdot, verbieten Sie, wenn Sie keine bedingten gets verwenden!)

  2. Überprüfen Sie das Datum "Letzte Änderung:" auf der Antwort. Ja, auch wenn Sie ein bedingtes GET verwenden. Einige Server behandeln sie nicht richtig. Wenn das Datum unverändert ist, ignorieren Sie den Feed.

  3. Vergleichen Sie die Rohdaten der Reaktion gegen den letzten Rohantwort Sie. Wenn identisch, ignoriere den Feed. (Einige Server unterstützen keine bedingten Abrufe oder senden zuletzt geänderte Daten ...)

  4. Jetzt müssen Sie das XML analysieren.

  5. Überprüfen Sie das Mod-Datum der obersten Ebene auf dem Feed selbst (dies variiert zwischen Atom und den verschiedenen Varianten von RSS.) Wenn es das gleiche wie beim letzten Mal ist, ignorieren Sie den Feed.

  6. Wenn Sie hier sind, wurde der Feed wahrscheinlich aktualisiert. Am einfachsten ist es, alle alten gespeicherten Einträge wegzuwerfen und durch neue zu ersetzen. Dies bedeutet jedoch, dass Sie keine "historischen" Einträge beibehalten können, die vom Ende des Feeds abgefallen sind. Wenn Sie dies tun möchten, müssen Sie jeden Eintrag im soeben analysierten Feed durchlaufen, ihn mit dem entsprechenden Eintrag in Ihrem persistenten Speicher abgleichen und den persistenten auf dem neuen speichern. Wenn Sie keine dauerhafte finden konnten, fügen Sie sie als neuen Eintrag hinzu. (Übereinstimmende Einträge können in lahmen RSS-Feeds, die keine eindeutigen GUIDs für jeden Eintrag enthalten, schwierig sein. Sie müssen versuchen, Permalinks und Titel zu vergleichen. Yuck.)

Das Ganze ist wirklich ein großes Durcheinander. Es hat viel Arbeit gekostet, um alles korrekt zu machen und mit all den defekten Feeds und Servern zu arbeiten. Nutzen Sie meine Schmerzen und verwenden Sie PubSub, wenn Sie können :)

0

Ein Ansatz wird mit dem eingebauten in NSXML Pull-Parser in einem Hintergrund-Thread und den Vergleich Einträge aus dem Stream zu dem, was man in Erinnerung haben, die Aktualisierung nur das, was sich geändert hat.

+0

Sie benötigen nicht einmal einen Hintergrundthread, sofern Sie den asynchronen Modus von NSURLConnection verwenden, um den Feed zuerst abzurufen. Das XML-Parsing ist schnell genug, dass Sie es im Hauptthread tun können. –

0

Ich habe gerade eine Open Source RSS/Atom Parser for iPhone freigegeben und hoffentlich könnte es von Nutzen sein.

Ich würde gerne Ihre Gedanken darüber auch hören!