2011-01-28 25 views
5

Ho problemi con l'impostazione di una proprietà temporanea nei dati principali. Il problema che sto cercando di risolvere è: ho una collezione di oggetti archiviati con successo usando Core Data. Questa raccolta è essenzialmente una raccolta di sola lettura, ma in fase di esecuzione, desidero associare un altro oggetto (una UIImage in questo caso) a ciascun elemento della raccolta. Non ho bisogno di memorizzare gli UIImages; è puramente un'associazione di runtime. Quindi quello di cui ho veramente bisogno è un 'segnaposto' in ogni oggetto nella collezione in cui posso rilasciare UIImage più tardi.Dati principali e proprietà transitorie

Un attributo transitoria sembra la cosa giusta e, per questo, i documenti di riferimento Core Data mi dicono che dovrei creare un "attributo di sovratensioni opzionale di tipo non definito" nel modello di dati che ho fatto: XCode snippet

Inoltre, mi viene comunicato che non è necessario definire una proprietà corrispondente nell'oggetto di implementazione ma che dovrò scrivere i metodi di accesso personalizzati & setter. Ho modellato questi metodi basati sugli esempi nella documentazione come segue:

- (void)setDisplayImage:(UIImage *)anImage { 

    [self willChangeValueForKey:@"displayImage"]; 
    [self setPrimitiveValue:anImage forKey:@"displayImage"]; 
    [self didChangeValueForKey:@"displayImage"]; 
} 

e:

- (UIImage *)displayImage { 

    [self willAccessValueForKey:@"displayImage"]; 
    UIImage *anImage = [self primitiveDisplayImage]; 
    [self didAccessValueForKey:@"displayImage"]; 

    if (anImage == nil) {  
     NSData *displayImageData = [self displayImageData]; 
     if (displayImageData != nil) { 
      anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData]; 
      [self setPrimitiveDisplayImage:anImage]; 
     } 
    } 
    return anImage; 
} 

C'è anche un metodo differito "write" (willSave) che ho scritto per il rigoroso completezza sebbene, come sopra, non scriverò mai più questi oggetti in negozio.

Il problema che sto ottenendo è nei metodi primitiveDisplayImage e setPrimitiveDisplayImage di - (UIImage *) displayImage {. Fondamentalmente, il compilatore lancia avvisi su questi due metodi come "l'oggetto X potrebbe non rispondere a 'primitiveDisplayImage' .." ecc. Tuttavia, la mia comprensione dai documenti è che questi primitivi accessor/setters vengono creati automaticamente - questo non sembra sii il caso Chiunque là fuori può aiutarmi a risolvere questo problema? Molte grazie

risposta

5

Il problema con i metodi setPrimitive... è che sebbene NSManagedObject risponda a loro in fase di runtime, il compilatore non ha modo di sapere che esistono. È possibile sopprimere i messaggi di avviso dichiarando il metodo nel file di intestazione della propria classe di entità, utilizzando una categoria in modo che il compilatore non vi urli per non averlo definito nella vostra implementazione.

Un'altra opzione è utilizzare semplicemente chiamando [self setPrimitiveValue:value forKey:@"key"]; per ciascuno degli attributi che è necessario accedere. Ho usato questo metodo in passato, anche se ho appena notato nei documenti che questo è scoraggiato in 10.5 e versioni successive.

3

trovato la risposta qui: Managed Object Accessor Methods

In sostanza: Dichiarare @propery nel file di intestazione categoria, definire @dynamic nel file di implementazione categoria.

Problemi correlati