Dati principali – Archiviazione di immagini (iPhone)

Ho un’applicazione in cui autorizzo l’utente ad aggiungere un’immagine per il proprio account.

Desidero sapere come memorizzare un’immagine (ottenuta dalla fotocamera o dalla libreria fotografica) utilizzando Core Data , poiché posso offrire una funzione di backup per l’utente e cerco di trasferire i dati dell’immagine su un server.

Ho trovato il suggerimento per la progettazione di creare un object modello Image e di creare una relazione 1 a 1 con l’object modello User (in modo che l’object Immagine associato non venga richiamato se non richiesto). Tuttavia, non sono sicuro di come memorizzare l’immagine e se ciò sia potenzialmente fatale in termini di prestazioni.

Sarei grato per qualsiasi consiglio sull’approccio e sulle insidie ​​di chiunque abbia tentato di farlo.

La regola per la memorizzazione dei dati di immagine in Core Data è la seguente:

  • <100 kb negozio nell'entità correlata (persona, indirizzo, qualunque).
  • <1 MB di archivio in un'entità separata sull'altra estremità di una relazione per evitare problemi di prestazioni.
  • 1 MB memorizza su disco e fai riferimento al percorso nel tuo negozio di dati principale.

È ansible utilizzare il tipo di dati trasformabili per archiviare NSImage direttamente in Core Data. In effetti è ansible utilizzare il tipo di dati trasformabili per archiviare tutto ciò che implementa il protocollo NSCoder.

Personalmente non lo convertirò in un CGImageRef in quanto potresti perdere molte informazioni in questo modo.

Il tempo è passato da quando è stata posta questa domanda, ma voglio condividere la mia esperienza su questo problema.

Non ti consiglio di salvare le immagini all’interno del DB se il loro numero non è limitato. Dovresti sempre ricordare che un giorno dovrai aggiungere una nuova versione del modello di dati e dovrai migrare dal vecchio DB a uno nuovo sull’aggiornamento delle app. Richiede tempo. Più grande è il file DB, più tempo è necessario per la migrazione.

Se si desidera memorizzare le immagini in DB, assicurarsi di non aggiungere un archivio persistente application: didFinishLaunchingWithOptions: metodo di UIApplicationDelegate . iOS interromperà la tua app se la migrazione non verrà completata entro XX secondi.

Pitfall: potresti finire con un database sqlite enorme, difficile da gestire. Vuoi veramente che i tuoi utenti caricino un file MB in un solo passaggio sul server? Che cosa fai se la connessione del celluar si interrompe per alcuni secondi?

Penso che sarebbe meglio se si usasse Core Data per la gestione delle immagini e il loro stato di caricamento (caricato: sì o no). In questo modo, puoi caricare le immagini quando si adatta al tuo stream di lavoro dell’applicazione. Ok, durerà un po ‘più a lungo, a causa delle molte connessioni. Ma è un approccio più pulito, penso …

Quando pensi a iTunes, quando parli di backup: la cartella “Documenti” dell’iPhone locale viene comunque sincronizzata.

Dovresti avere aaa, quindi puoi fare qualcosa del genere:

 CGImageRef imageRef = uiImage.CGImage; CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef); NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider); [managedObject setValue:imageData forKey:@"data"]; 

Dove managedObject è il tuo object immagine dati principale e @ “data” è il nome della proprietà binaria. Potrebbe anche essere necessario salvare il formato dell’immagine per deserializzare l’immagine in un secondo momento.

Un’altra opzione è salvare l’immagine su disco e memorizzare il percorso nei dati principali.