2014-05-23 12 views
9

Desidero memorizzare un oggetto UIColor come attributo su un'entità Core Data, quindi recuperarlo e utilizzarlo nello stesso modo in cui eseguo gli altri attributi su tale entità.Memorizzazione dell'oggetto UIColor nei dati principali

Nella mia ricerca, mentre la letteratura sembra piuttosto scarsa, trovo this post dire che l'attributo deve essere specificato come "trasformabile", e che i dati devono essere convertiti manualmente andando nella utilizzando NSKeyedArchiver e in uscita utilizzando NSKeyedUnarchiver.

Ma poi, trovo a more recent post dicendo che tutto ciò che è necessario è salvare UIColor come un attributo trasformabile in CD, generare una sottoclasse di oggetto gestito e usare proprio come altri attributi.

Il Apple docs themselves entra nei dettagli sulla memorizzazione e il recupero di oggetti NSColor, ma non (che ho trovato) su UIColor. Tuttavia, sembra che l'archiviazione/l'archiviazione sia gestita automaticamente all'interno del CD. Può essere. Sono stato confuso da questa riga:

Se si utilizza l'editor del modello in Xcode, selezionare Trasformabile nel popup Tipo dell'attributo e digitare il nome nel campo di testo Nome trasformatore valore.

presumo che stanno parlando il nome dell'attributo, ma non sono sicuro, soprattutto dal momento che mette in guardia sui potenziali problemi derivanti dalla specificando il trasformatore in modo esplicito:

Importante: Anche se il trasformatore di default è il trasformatore specificato da NSKeyedUnarchiveFromDataTransformerName, questo trasformatore viene effettivamente utilizzato al contrario. Se specifichi il trasformatore predefinito in modo esplicito, Core Data lo userebbe "nella direzione sbagliata".

Sono arrivato al punto in cui ho un nuovo attributo trasformabile chiamato "color", (non ho chiamato il trasformatore) e hanno generato un nuovo file di sottoclasse contenente la nuova proprietà "color" (id di tipo).

Sono semplicemente perplesso. Qualcuno può darmi qualche consiglio definitivo su come procedere da qui?

Sto usando MagicalRecord per interfacciare con Core Data, se questo è importante.

Grazie mille per l'aiuto!

risposta

26

L'attributo deve essere del tipo Trasformabile. Il valore predefinito trasformatore (NSKeyedUnarchiveFromDataTransformerName) può trasformare qualsiasi oggetto conforme a NSCoding.

  1. Contrassegnare l'attributo come tipo "Tranformabile".
  2. Facoltativo: impostare il Nome trasformatore valori su "NSKeyedUnarchiveFromDataTransformerName". Se non lo fai, lo farà in ogni caso.

Like so

Non devi fare altro. Tieni presente che non sarai in grado di associare un attributo trasformabile con un predicato o un ordinamento da parte loro. Sono praticamente solo storage: il trasformatore di valori trasforma il valore dell'oggetto in NSData, che è ciò che viene mantenuto nell'archivio. Quando il difetto dell'attributo viene attivato, Core Data utilizza il trasformatore nell'altra direzione per passare da NSData al tipo di oggetto.

+0

Grazie, @quellish! Immagino che questa sia un'innovazione relativamente recente, poiché i riferimenti precedenti sembrano indicare misure più rigorose. – rattletrap99

+0

No, ci sono stato per molto, molto tempo. – quellish

+0

Grazie per il vostro aiuto, signore (o signora, a seconda dei casi). Funziona perfettamente! – rattletrap99

1

Per salvare un UIColor in dati di base è necessario separare i valori rosso, blu e verde. Quindi, all'interno del codice di creazione, recupera i valori RGB e crea un oggetto UIColor con i risultati recuperati. Questo è molto più semplice di quanto sembri e non è necessario fornire alcun aiuto con NSKeyArchiver/Unarchiver o NSUserDefaults.

Nel modello di dati, all'interno della propria entità colore, creare tre attributi: rosso, verde e blu di tipo mobile. Quindi sottoclasse NSManagedObject per l'entità del colore. (se hai lavorato con i dati di base prima che questo possa sembrare familiare.) Ma questa non è una domanda su come usare i dati di base, quindi ci arriverò.

Per l'argomento, genereremo un colore casuale e lo conserveremo nei dati di base (è possibile impostare i valori RGB in qualsiasi colore si desideri).

Per prima cosa creare tre proprietà di tipo float nel file di implementazione di qualsiasi classe si utilizzi.

@property (nonatomic) float randomRedColor; 
@property (nonatomic) float randomBlueColor; 
@property (nonatomic) float randomGreenColor; 

Configurare il metodo di salvataggio di dati di base con al minimo, 3 parametri di tipo float per ogni valore RGB. Ricorda che gli attributi di entità devono essere un oggetto e non di un tipo primitivo, quindi racchiudere i valori float in un NSNumber quando si imposta il valore per la chiave.

-(void) withColors:(float)redColor withBlue:(float)blueColor withGreen:(float)greenColor{ 

//set up NSManagedObjectContext/EntityDescription/ManagedObject (core data) 

self.randomRedColor = redColor; 
self.randomBlueColor = blueColor; 
self.randomGreenColor = greenColor; 

[newCategory setValue:[NSNumber numberWithFloat:redColor] forKey:@"red"]; 
[newCategory setValue:[NSNumber numberWithFloat:blueColor] forKey:@"blue"]; 
[newCategory setValue:[NSNumber numberWithFloat:greenColor] forKey:@"green"]; 

//save new objects (core data) 

Ovunque si ha intenzione di chiamare questo metodo, si creerà tre carri con valori casuali, e passarle in: (mi piace fare tutto questo insieme in una fonte di dati, quindi non preoccupatevi circa la mia sharedInstance. Se non si ha familiarità con il pattern Singleton, non ti preoccupare, sto semplicemente chiamando il metodo e passando nei valori generati in modo casuale come i nostri argomenti.)

float red = (arc4random()%256/256.0); 
float blue = (arc4random()%256/256.0); 
float green = (arc4random()%256/256.0); 

[[DataSource sharedInstance] withColors:red withBlue:blue withGreen:green]; 

Ora semplicemente import il tuo file di intestazione Color NSManagedObject e crea la tua proprietà Color NSManagedObject in questo caso la chiameremo * colore:

Supponendo che chiunque stia leggendo questo sa come eseguire una richiesta di recupero, ora utilizzeremo i nostri attributi * rosso * blu e * verde che sono stati forniti quando abbiamo sottoclassato la nostra entità Colore.

float red = [self.category.red floatValue]; 
float green = [self.category.green floatValue]; 
float blue = [self.category.blue floatValue]; 

tutto ciò che rimane è quello di memorizzare i valori recuperati in oggetto UIColor:

UIColor *randomRGBColor = [[UIColor alloc] initWithRed:red green:green blue:blue alpha:1.0]; 

Ora il gioco è fatto. Hai salvato con successo l'oggetto UIColor. Spero che aiuti!

4

Un'altra opzione disponibile, Swift 3

extension UIColor { 
    class func color(withData data:Data) -> UIColor { 
     return NSKeyedUnarchiver.unarchiveObject(with: data) as! UIColor 
    } 

    func encode() -> Data { 
     return NSKeyedArchiver.archivedData(withRootObject: self) 
    } 
} 

Uso

var myColor = UIColor.green 
// Encoding the color to data 
let myColorData = myColor.encode() // This can be saved into coredata/UserDefaulrs 
let newColor = UIColor.color(withData: myColorData) // Converting back to UIColor from Data 
+2

Si prega di non aggiungere la [stessa risposta] (http://stackoverflow.com/a/41800750/5292302) a più domande. Rispondi al migliore e contrassegna il resto come duplicato. Vedi [È accettabile aggiungere una risposta duplicata a diverse domande?] (Http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplica te-answer-to- diverse-domande) –

Problemi correlati