2011-08-09 8 views
7

Ho un'app per iPhone ragionevolmente complessa che si basa su un'API per recuperare i dati da un server e visualizzarli all'utente. Ho circa 5 classi di modelli che sono utilizzate in tutta l'app, semplicemente estendono NSObject.Aggiunta di dati principali all'app per iPhone con modelli (normali) esistenti

Desidero aggiungere una certa persistenza ai modelli, per consentire l'utilizzo di alcune parti dell'app anche se il dispositivo è offline, in realtà si tratta in pratica di una cache glorificata. Voglio solo che alcune istanze dei miei modelli vengano mantenute persiste, ad esempio, gli elementi che l'utente ha aggiunto ai segnalibri, mentre altri no, ad esempio centinaia di risultati di ricerca.

I Core Data sono la soluzione giusta per questo? Le difficoltà che posso vedere sono:

  • Dovrei cambiare il modo in cui istanziato i miei oggetti modello in tutto il progetto. Dovrei inizializzarli come parte di un contesto, il che non ha necessariamente senso se provengono effettivamente da un'API esterna.
  • Avrei bisogno di stare attento a non persistere istanze che non voglio. Questo sembra ridursi a uno l'eliminazione di un oggetto gestito subito dopo è stato creato (davvero imbarazzante) oppure utilizzando un contesto non-persistente separata per le istanze non voglio persisteva (meglio, ma ancora un po 'scomodo)

Speravo di poter continuare a utilizzare i miei modelli in tutta l'app senza modificare il codice che non ha bisogno di preoccuparsi della persistenza, ma ciò non sembra fattibile date le mie esigenze. L'alternativa è impostare un nuovo set di oggetti gestiti in parallelo ai miei oggetti esistenti e utilizzare solo gli oggetti gestiti per la persistenza, ma questo tipo di duplicazione non sembra mai la soluzione giusta.

Dovrei provare a calzare Core Data in questo, e se sì, come? O dovrei semplicemente guardare altre opzioni - sqlite3 (sembra un po 'complicato per quello di cui ho bisogno), impostazioni predefinite dell'utente (probabilmente non per quello a cui sono destinate), o anche serializzare e scrivere i miei oggetti su file (sembra hack-ish).

Grazie per qualsiasi input!

risposta

3

Perché non dare un'occhiata a NSKeyedArciver/Unarchiver? Direi che Core Data è la soluzione più ovvia quando si lavora con grandi quantità di dati insieme a database SQLite, ma NSKeyedArchiver è quello che uso per salvare i modelli. Scopri la documentazione Apple here. L'uso di NSKeyedArchiver è un IMO piuttosto semplice e puoi memorizzare praticamente tutto ciò che ti serve.

+0

Grazie! Non posso credere di aver perso NSKeyArchiver. Darò un colpo - potrebbe essere esattamente quello di cui avevo bisogno. –

+0

Nessun problema, felice di aiutare (: –

1

In questo istante istanziate gli oggetti dati come sottoclassi di NSObject. È possibile utilizzare un altro livello di riferimento indiretto per scegliere se creare invece un oggetto come sottoclasse di ManagedObjectModel e mantenere la maggior parte delle app non trattate utilizzando un protocollo che definisce l'interfaccia che si utilizza per accedere alle informazioni da tali oggetti, quindi passando gli oggetti di tipo id<DataObjectProtocol> . Il mancato recupero potrebbe essere un'indicazione di un oggetto non locale.

In alternativa è possibile creare tutto come oggetto gestito e non memorizzare altro che una chiave per i dati che non si desidera memorizzare localmente. In questo modo puoi sapere se esiste qualche oggetto e come recuperarlo se necessario, ma non spendi molto tempo o spazio per mantenere i dati che dovrebbero rimanere nel cloud. Il modo per farlo sarebbe quello di definire tutto tranne la chiave nel modello come opzionale.

Vorrei scegliere i dati principali per la sua flessibilità, utilità e ottimizzazione. Vale davvero la pena imparare. Non consiglierei l'approccio sqlite3, la via da seguire su iOS è Core Data.Se utilizzi un qualche tipo di archiviazione di file, dovresti pensare a come eseguire letture e/o scritture in batch, poiché potresti riscontrare problemi di prestazioni non soddisfacenti eseguendo più operazioni su file di piccole dimensioni.

+0

Grazie, alcune buone idee! Darò a NSKeyedArchiver una possibilità, come suggerito nell'altro commento, perché sembra semplice e non dovrebbe richiedere più di un giorno per collegarlo. Ho alcuni problemi di prestazioni con esso, se non funziona, mi ritroverò su qualcosa di simile ai tuoi suggerimenti. –

Problemi correlati