2013-04-06 8 views
18

Utilizzo di CoreData Ho creato un'entità, quindi l'ho sottoclassata nel proprio file, dove ha le @propertys, quindi ha le parti @dynamic nel file .m.Con CoreData, se ho una proprietà @dynamic, posso sovrascrivere il suo getter come se fosse @synthesized? (Lazy Instantiation)

Quando voglio qualcosa per avere un certo valore se non è mai stato impostato, io uso sempre instanziazione pigro, come segue:

- (NSString *)preview { 
    if ([self.body length] < 200) { 
     _preview = self.body; 
    } 
    else { 
     _preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
    } 

    return _preview; 
} 

Ma come faccio a fare questo con proprietà @dynamic? Se faccio la stessa cosa, si dice _preview è una proprietà non dichiarata, ma è nel file .h. Cosa faccio di diverso da lazy istanziarlo?

+1

Dice '_preview' è un _indentificatore_ non dichiarato, perché non hai una variabile con quel nome. '@ synthesize' crea la variabile; '@ dynamic' no. –

risposta

27

Un metodo standard è quello di definire preview come un attributo transitoria nel modello Core Data (in modo che il valore non è effettivamente memorizzata nel database) e implementare un metodo getter personalizzato. Nel tuo caso sarebbe assomigliare:..

- (NSString *)preview 
{ 
    [self willAccessValueForKey:@"preview"]; 
    NSString *preview = [self primitiveValueForKey:@"preview"]; 
    [self didAccessValueForKey:@"preview"]; 
    if (preview == nil) { 
     if ([self.body length] < 200) { 
      preview = self.body; 
     } else { 
      preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
     } 
     [self setPrimitiveValue:preview forKey:@"preview"]; 
    } 
    return preview; 
} 

(è possibile fornire getter personalizzato, i metodi setter per le proprietà @dynamic Tuttavia, Core Data proprietà non sono semplicemente supportati da variabili di istanza Questo è il motivo per cui si non può accesso _preview.)

Se è necessario il preview per essere ricalcolato se il body cambiamenti attributi, allora si inoltre necessario implementare un metodo setter personalizzato per body che imposta preview torna a nil.

Per ulteriori informazioni, leggere Non-Standard Persistent Attributes nella "Guida alla programmazione dei dati principali".

Aggiornamento: L'attuale versione della Guida alla programmazione Core Data non non contiene più quel capitolo. È possibile trovare una versione archiviata dal Way Back Machine. Naturalmente questo deve essere preso con un granello di sale poiché non fa più parte della documentazione ufficiale .

+0

Risposta perfetta @ Martin. – satheeshwaran

+0

@satheeshwaran: Grazie. –

+0

È sufficiente utilizzare questo metodo? O devo fare qualcosa nel file CoreData? – user212541

6

See documentation sull'uso primitiveValueForKey:

fondamentalmente:

@dynamic name; 

- (NSString *)name 
{ 
    [self willAccessValueForKey:@"name"]; 
    NSString *myName = [self primitiveName]; 
    [self didAccessValueForKey:@"name"]; 
    return myName; 
} 

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
} 
Problemi correlati