2015-07-11 7 views
29

Ho incontrato questa parola chiave in varie occasioni. Io so cosa si suppone di fare. Ma voglio davvero una migliore comprensione di ciò.Cosa fa @NSManaged?

Quello che ho notato su @NSManaged - basata non sulla documentazione, ma l'uso ripetuto:

  1. Esso sostituisce magicamente codifica valore della chiave.
  2. E 'grosso modo equivalente a @dynamic in Objective-C (che non so molto circa)
  3. ho bisogno di sottoclasse PFObject dal Parse SDK. Normalmente usa KVC per leggere/scrivere valori da/verso il back-end.
  4. La prefissazione di qualsiasi variabile con @NSManaged interromperà il compilatore quando non si inizializza all'interno dell'inizializzatore.

La definizione formale (in Core Data di Apple Docs):

Core Data fornisce la storage sottostante e la realizzazione di immobili a sottoclassi della classe NSManagedObject. Aggiungere l'attributo @NSManaged prima di ogni definizione di proprietà nella sottoclasse dell'oggetto gestito che corrisponde a un attributo o una relazione nel modello di dati di base. Come l'attributo @dynamic in Objective-C, l'attributo @NSManaged informa il compilatore Swift che la memorizzazione e l'implementazione di una proprietà verranno fornite in fase di runtime. Tuttavia, a differenza di @dynamic, l'attributo @NSManaged è disponibile solo per il supporto dei dati principali.

Che cosa ho ottenuto da questo:

variabili con @NSManaged sono esenti da controlli in fase di compilazione per qualcosa.

Ho letto la documentazione formale e vari altri SO domande riguardo a questa questione:

@synthesize vs @dynamic, what are the differences?

What is common case for @dynamic usage?

istintivamente riconoscere alcuni scenari in cui dovrei usarlo. I parzialmente so cosa fa. Ma quello che cerco è una comprensione più pura di ciò che fa.

Ulteriori osservazioni:

A PFObject nel Parse SDK si basa su Key Value Coding per accedere ai relativi valori.Il PFObject fornisce le seguenti funzioni di accesso:

objectForKey:

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object 

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of descriptionOfResult 

Per la mia comprensione, @NSManagedmagicamente capisce che la variabile ho dichiarato automaticamente utilizza le funzioni di accesso di cui sopra per get e set. Mi piacerebbe sapere come funziona (se quello che capisco è vero), e qualsiasi altra cosa faccia.

+0

Hai mai scoperto come è stato raggiunto il comportamento osservato (in Ulteriori osservazioni)? In che modo @NSManaged utilizza gli accessor corretti? – Jason

+0

l'attributo @NSManaged è disponibile solo per il supporto di Core Data non completamente corretto. Devi anche usarlo per le variabili rapide di CoreAnimation che vuoi animare su: http://stackoverflow.com/questions/24150243/are-needsdisplayforkey-actionforkey-overrides-working-correctly – ambientlight

risposta

28

Sì, funziona davvero come @dynamic - tecnicamente potrebbe essere identico anche. Semanticamente c'è una leggera differenza:

@dynamic dice 'compilatore, non controllare se anche le mie proprietà sono implementate. Potrebbe non esserci codice visibile, ma garantisco che funzionerà in fase di esecuzione '

@NSManaged ora dice' compilatore, non controllare quelle proprietà perché ho i dati di base per occuparsi dell'implementazione - sarà lì in fase di esecuzione'

modo si potrebbe anche dire: @NSManaged è zucchero sintattico che è una versione più stretta della dinamica :)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
qui qualcuno anche usato @NSManaged senza CD perché voleva la comportamento @ dinamico

+0

Voglio tuffarmi un po 'più a fondo nel importa - In che modo normalmente il compilatore sa come viene implementata la proprietà e in che modo '@ NSManaged' fa in modo che il compilatore rimandi questa responsabilità altrove? È simile alla chiamata 'super' quando si sostituisce un metodo? È '@ NSManaged' che dice al compilatore:" Ottieni i dettagli di implementazione dalla superclasse "? –

+0

normalmente, nella compilazione il codice macchina per metodo (o proprietà) deve essere lì - questo è ciò che il compilatore controlla. MA il runtime objC/swift supporta l'aggiunta di codice macchina in fase di esecuzione ... quindi qualcuno deve aggiungere il codice appena in tempo :) con NSManaged, coreData fa proprio questo per te.Il codice NON è nella superclasse ma generato al volo –

+0

@KelvinLau hai ancora domande qui? –

1

Nel apple docs, per la Classe Managed Object personalizzato, citano proprietà esempio come ... enter image description here A me sembra che ci sia alcuna differenza, ho usato @dynamic in Objective C, sembra @NSManaged è la sostituzione di Swift.

0

Le risposte sopra indicate sono corrette. Ecco la mia comprensione.

@NSManaged indica che le variabili otterranno alcuni valori quando eseguiremo l'app. Coredata crea automaticamente getter e setter per tali oggetti di scena. Mette a tacere il compilatore per gli avvisi.

NSmanaged è una sottoclasse di NSObject. @NSManaged significa che verrà dato un codice aggiuntivo a questi oggetti di scena in fase di esecuzione. Tiene traccia delle modifiche apportate a tali proprietà.