2013-12-12 7 views
12

Come posso trovare il metodo di sostituzione in MagicalRecord per questo (che è stato deprecato)? Ho dato un'occhiata a Google, SO e ai documenti; nulla sembra essere un rimpiazzo e, naturalmente, nulla nei documenti ti dice cosa ha sostituito il metodo deprecato. : - {Qual è il metodo di sostituzione per questa chiamata deprecata MagicalRecord?

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveErrorHandler:^(NSError *error) 

risposta

23

Il Metodo obsoleto in questione è:

[NSManagedObjectContext MR_contextForCurrentThread] 

ho scritto un po 'di blog post su questo qualche tempo fa, anche se ammetto che è sul mio blog personale, e non è in alcun documenti ufficiali. Ma, TL; DR, la linea di fondo è, nel mondo di GCD e code, non è possibile garantire un 1-1 di una coda a un thread, nonostante GCD sia eseguito su thread. Il modo per assicurarsi che le cose lavori in corso in avanti per voi sta utilizzando il seguente schema:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 
    //make your changes in the localContext 
}]; 

Questo risolve i problemi di thread trasversali sottili che emergono in contextForCurrentThread semplicemente far rispettare la regola che si dovrebbe fare tutto il lavoro in un diverso thread in un contesto specifico del thread. Creando un nuovo contesto ogni volta che salvi e non riutilizzi il contesto, garantirai di non attraversare i thread e di non far crashare la tua app l'1% delle volte.

+1

Così cosa sostituisco ** MR_saveErrorHandler: ** con? – SpokaneDude

+0

Uno dei seguenti: MR_saveOnlySelfAndWait, MR_saveOnlySelfCompletion :, MR_saveToPersistentStoreAndWait, MR_saveToPersistentStoreCompletion: – casademora

+0

Grazie mille ... su un argomento diverso, mi piace leggere i documenti in un PDF ... ti interesserebbe creare un PDF del corrente file nella cartella Documenti? Mi piacerebbe "ripagarlo" per così dire ...: D – SpokaneDude

1

casademora è corretto, ma cercherò di essere più precisi, perché ho incontrato alcuni problemi durante la conversione di mio

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:nil]; 

in

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 

Bisogna stare attenti a modificare o creare le entità dentro il blocco ma non è abbastanza.

Per recuperare le entità è necessario utilizzare la richiesta di selezione anche con contesto.

MR_findFirstByAttribute:withValue 

non è sufficiente e gli aggiornamenti non verranno salvati. Devi usare invece

MR_findFirstByAttribute:withValue:InContext:localContext 

E quando la creazione di entità, è la stessa

MR_createEntity 

deve essere il cambiamento di

MR_createEntityInContext:localContext 

allora funziona come un fascino :)