Recupero Core Data in background
-
20-09-2019 - |
Domanda
Ho una visione di navigazione con un Table View, quando una riga viene cliccato, l'indexPath riga viene passata alla visualizzazione successiva.
Nella vista dei dettagli viewDidLoad, sto il recupero dei dati da Core Data. io uso il recupero dal delegato applicazione
[appDelegate loadItem:i];
Come si può vedere sto passando un intero solo che porta il numero di riga.
la domanda è: Come posso fare questo processo di chiamata in un altro thread. (Sullo sfondo) Ho bisogno di questo perché a volte il risultato del recupero è troppo grande, in modo che il trattamento richiede 3 secondi ritardare spingendo il dettagli Visualizza.
Ho bisogno di visualizzare un indicatore di attività per i tre secondi, quindi ho bisogno di mettere il Fetch in un altro thread per poter utilizzare l'interfaccia utente per l'indicatore, mentre l'operazione di recupero è in elaborazione.
Voglio il modo più semplice come io sono un novizio. Distacco alcuni codici sarà grande. o link:)
Soluzione
miscelazione multithreading e Core Data non è un compito semplice. Il "Multi-Threading con core Data" sezione della programmazione core Data Guida descrive come interagire con core Data su più thread, tra tutte le cose che avete bisogno di stare attenti.
In sostanza, è necessario creare un contesto distinto oggetto gestito per ciascun thread. Questi contesti possono condividere l'accesso a un modello oggetto gestito e archivio permanente. Per il vostro caso, essi suggeriscono il seguente:
Si utilizzano due contesti oggetto gestito associato ad un unico persistente coordinatore del negozio. Si recupera in una contesto oggetto gestito su uno sfondo filo, e superare gli ID oggetto della oggetti recuperati a un altro filo. Nel la seconda filettatura (tipicamente thread principale dell'applicazione, in modo che si possono poi visualizzare i risultati), si utilizza il secondo contesto di difetto in oggetti con quegli ID oggetto (si utilizza objectWithID: creare un'istanza della oggetto).
Sembra che il campione BackgroundFetching applicazione mostra come fare questo, ma io non ce l'ho sul mio sistema.
Tuttavia, prima di arrivare troppo lontano nel multithreading tua richiesta di recupero, mi piacerebbe prendere uno sguardo duro sul perché sta prendendo così tanto tempo per caricare. Prima di tutto avrei consiglia di utilizzare -setFetchBatchSize: sul NSFetchRequest per limitare il numero di oggetti caricati in memoria tramite il fetch (che vi farà risparmiare un sacco di memoria, anche). Avanti, userei -setPropertiesToFetch:. Per limitare le proprietà azzardato solo quelli che userete immediatamente