Eseguo il mio programma che crea contenuto di dati di base che viene visualizzato in un NSOutlineView utilizzando NSTreeController. La seconda volta che eseguo il programma, desidero pulire il contenuto del mio NSTreeController
ed eseguo il metodo incollato di seguito. Il metodo si blocca per un lungo periodo (600 secondi) prima che termini o si arresti. Se ho poche entità (500-1000) nel mio NStreeController
ci vuole molto meno tempo rispetto a se ho un sacco di (200.000) entità per passare questo metodo, se non passa affatto. Quello che devo sapere è se c'è un modo migliore per cancellare/aggiornare/ripristinare il contenuto del mio NStreeController
per cancellare il mio NSoutlineView
prima di rieseguire il mio programma e riempire nuovamente il NStreeController
. Nello specifico, vorrei che il mio NSOutlineView
risponda rapidamente alle modifiche ai contenuti del mio NSTreeController
, e ho bisogno del contenuto del mio core Data NSTreeController
per poter essere resettato.Ripristina contenuto TreeController contenuto dati Core
-(void) cleanSDRDFileObjects
{
__weak __typeof__(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.outlineView collapseItem:nil collapseChildren:YES];
[weakSelf.coreDataController._coreDataHelper.context performBlockAndWait:^{
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:@"SDRDFileObject" inManagedObjectContext:weakSelf.coreDataController._coreDataHelper.context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSArray * result = [weakSelf.coreDataController._coreDataHelper.context executeFetchRequest:request error:nil];
for (id fileobject in result){
[weakSelf.coreDataController._coreDataHelper.context deleteObject:fileobject];
}
[weakSelf.coreDataController._coreDataHelper.context processPendingChanges];
NSLog(@"Finished deleting all objects");
}];
});
}
Il managedobjectcontext (context
) viene eseguito come tipo NSMainQueueConcurrencyType
e il metodo viene eseguito sul thread principale. Suggerimenti per miglioramenti, o esempi utili per la combinazione di reset/aggiornamento di NSOutlineView + Core Data sarebbero molto apprezzati. Grazie. Cheers, Trond
In risposta alla domanda @TomHarringtons ho scattato una foto del mio Time Profiler. Io davvero don t understand why it hangs on this method, however, after commenting this methods out (```processPendingChanges```), it still hangs and takes forever to finish (6 minutes). It seems the process gets stuck on the main thread and can
t continuare.
Quando esegue nuovamente l'applicazione, con processPendingChanges
commentato la sua ancora appeso.
Aggiornamento
credo ho risolto questo, ma io sono un po 'incerta sul motivo per cui questo ha funzionato. Sembra che il mio primo metodo sia entrato in un ciclo indefinito che non ha rilasciato i suoi oggetti. La seguente soluzione semplice lavorato:
__weak __typeof__(self) weakSelf = self;
dispatch_sync(dispatch_get_main_queue(), ^{
[weakSelf.coreDataController._coreDataHelper.context reset];
});
ero certo che per svuotare correttamente un contesto oggetto gestito avrei dovuto eliminare ogni entità individuale. La funzione di reset sembra una forza bruta e in realtà pulisce la memoria e si assicura che tutto sia a posto? Se qualcuno vuole far luce su ciò che sarebbe apprezzato.
will/doneChangeValueForKey viene generalmente chiamato dagli accessors dell'istanza 'self'. Perché li chiameresti con questo metodo? E NSTreeController non ha nemmeno un "figlio" keyPath. Ha un keyPath "childrenKeyPath". Indipendentemente da tutto ciò, stai cercando 'riorganizzaOggetti '?? – stevesliva
['rearrangeObjects'] (http://stackoverflow.com/questions/23773827/how-can-i-determine-if-apple-methods-are-asynchronous/) a volte pianificherà l'aggiornamento della GUI nella coda principale dei thread, quindi potrebbe avere qualcosa a che fare con il tuo problema. Ciononostante, il tuo uso dei metodi KVC è spaventoso, e dovresti studiarlo prima di usare/didChangeValueForKey. Mi chiedo anche quando si spinge le modifiche dal contesto di sfondo al contesto mainThread/GUI. – stevesliva
@stevesliva Grazie per i vostri commenti. Mi rendo conto di aver copiato e incollato il mio codice mentre stavo testando a caso KVO (Ill study). Ho usato KVO su arrangedObjects (senza successo). Ora vedo che il mio delegato outlineView si arresta in modo anomalo mentre sto eliminando le entità, soprattutto quando elimino un'entità prima di eliminare i suoi figli e la outlineview tenta di aggiornare un elemento deallocato. Se hai suggerimenti per la migliore pratica nel reimpostare una vista tabella o una vista panoramica guidata da Core Data sarebbe fantastico. Ho cercato su Google questo problema ma non riesco a trovare buoni esempi su come reimpostare una visualizzazione guidata dei dati principali. –