2009-09-29 7 views
9

Quali sono le buone pratiche per estrarre in modo asincrono grandi quantità di XML da un servizio RESTful in un archivio dati Core e da questo negozio, popolando uno UITableView al volo?Buone strategie per REST -> XML -> Dati di base -> UITableView?

Sto pensando di utilizzare la funzione di libxml2 xmlParseChunk() per analizzare pezzi di XML in entrata e tradurre un nodo ed i suoi figli negli oggetti gestiti rilevanti, come nodi entrano.

Allo stesso tempo, che questi nodi XML sono trasformato in oggetti gestiti, voglio generare righe UITableView, a turno. Dì, 50 file alla volta. È realistico?

In base alla vostra esperienza, cosa si fa per eseguire questa attività, per mantenere le prestazioni e gestire, potenzialmente, migliaia di righe? Esistono approcci diversi e più semplici che funzionano altrettanto bene o meglio?

+1

È possibile trovare http://cocoawithlove.com/2009/09/optimizing-loading-of-very-large-table.html utile. –

risposta

14

Certo, questa è una cosa piuttosto standard. La soluzione più semplice è eseguire il caricamento in un thread in background su un MOC e avere l'interfaccia utente in esecuzione sul thread principale con il proprio MOC. Ogni volta che si ottiene una porzione di dati che si desidera visualizzare (ad esempio 50 voci), si dispone dello sfondo MOC save:.

Supponendo di avere il MOC in primo piano truccato per unire le modifiche (via mergeChangesFromContextDidSaveNotification:) quindi ogni volta che si salva lo sfondo MOC il MOC in primo piano otterrà tutte quelle modifiche. Supponendo che stai usando NSFetchedResultsController ha metodi delegati per far fronte alle modifiche nel suo MOC, e se stai usando il codice di esempio di Apple, probabilmente hai già tutto configurato correttamente.

In generale, CoreData sarà più veloce di qualsiasi cosa tu faccia rotolare te stesso a meno che tu non sappia veramente cosa stai facendo e sia disposto a dedicare un sacco di tempo all'ottimizzazione per il tuo caso specifico.La cosa più importante che puoi fare è assicurarti che le cose lente (come l'elaborazione XML e l'I/O flash sincrono causato da save:) non siano sul thread principale che blocca l'interazione dell'utente.

+0

+1, ma mi piacerebbe ficcare http://sqlitepp.berlios.de/ contro CoreData in una partita death senza esclusione di colpi per vedere quale è più veloce – slf

+3

Posso assolutamente (e avere) battere CD su carichi di lavoro specifici utilizzando SQLite3 direttamente. Ma di solito la quantità di sforzi coinvolti era oscena. Avrei finito con un'app migliore utilizzando CoreData, e poi prendendo 1/3 delle volte che ho salvato l'ottimizzazione di altri pezzi della mia app. Non scriviamo codice nel vuoto. Ho imparato nel modo più duro in cui è spesso meglio rinunciare ad alcune prestazioni teoriche assolute e utilizzare i risparmi di tempo per apportare miglioramenti (più ampi) alle prestazioni pratiche ad altri pezzi di un codice di app. Ovviamente, i dettagli esatti variano da progetto a progetto. –

+0

Esiste un codice di esempio che dimostri l'utilizzo di più MOC con modifiche unite a un MOC principale? –

2

Joe Hewitt (sviluppatore di app di Facebook) ha rilasciato gran parte del suo codice come open-source. Si chiama Three20. Esiste una classe che è ottima per il recupero dei dati di Internet e il loro inserimento in una tabella, senza la necessità di dati preliminari. Le classi utilizzate per questo sono chiamate TTTableViewController e TTTableViewDataSource.

Da qui, non sarebbe molto utile archiviare come CoreData, basta sottoclasse le classi come meglio credi con i ganci forniti.

Se sei preoccupato per troppi dati, 50 alla volta sembra ragionevole. Queste classi hanno un pulsante "Altro" integrato per aiutarti.

Dal readme Three20:

Internet-aware vista tabella controllori
TTTableViewController e TTTableViewDataSource aiutare a tabelle di build che caricano il loro contenuto da Internet. Piuttosto che a patto di avere tutti i dati pronti ad andare, come UITableView fa da impostazione predefinita, consente TTTableViewController di comunicare quando i dati sono carico, e quando si verifica un errore o niente da visualizzare. Inoltre, è possibile aggiungere per aggiungere un pulsante "Altro" per caricare la successiva pagina di dati e, opzionalmente, supporta il ricaricamento dei dati scuotendo il dispositivo .

+0

Immagino di non essere chiaro. In realtà voglio popolare un negozio di dati di base, che a sua volta popola una vista tabella. Non è chiaro che questa sottoclasse risolva questo particolare problema, se tira dati cella per cella (che non è quello che devo realizzare). –

0

Nessuno ha menzionato lo RestKit? I miei amici ... sul serio, devi verificarlo. Se stai facendo qualcosa con REST su iOS (e ora su OS X) e in particolare se vuoi lavorare con Core Data ... PER FAVORE, dai un'occhiata a RestKit. Ho risparmiato innumerevoli ore implementando una sincronizzazione dei dati piuttosto complessa tra un server e i miei modelli Core Data su iOS. RestKit ha reso tutto così facile, che ti fa quasi star male.

+0

RestKit sembra faticare con XML: il parser XML che viene fornito ha errori ARC quando è compilato su iOS 5. Nel complesso, tuttavia, sembra fantastico - in particolare per JSON diretto. – radven