2012-08-04 12 views
5

Sto utilizzando un dato principale, NSFetchedResultsController UITableView, con un attributo transitorio NSDate. Il motivo principale per cui ho questa proprietà transitoria è che le mie voci di UITableView vengono inserite in sezioni basate su NSDate, ma possono spostarsi tra le sezioni quando la data cambia.iOS - Come aggiornare/aggiornare la proprietà transitoria di Core Data?

Finora sembra funzionare alla grande, ma aggiorna solo/aggiorna (sono davvero nuovo a questo, quindi non so se sto usando la terminologia corretta, scusa!) Quando chiudo o chiudo app e ucciderlo dal multitasking, o rieseguirlo tramite Xcode. Se non lo faccio, gli articoli non cambiano e non vengono inseriti nelle sezioni corrette. C'è un modo per farlo manualmente per l'aggiornamento in modo che l'utente non ha bisogno di farlo per farlo funzionare giusto?

Grazie!

+0

Come vengono propagati gli aggiornamenti? NSFetchedResultsController delegato? – Mundi

+0

Sì, penso di sì. – mhbdr

+1

Potrebbe essere importante che con un negozio SQlite non sia possibile utilizzare gli attributi transitori per i descrittori di ordinamento. –

risposta

3

Le proprietà dei transienti vengono aggiornate quando si invia un oggetto refreshObject:mergeChanges: all'oggetto.

La soluzione fornita da Mundi per applicare il meccanismo di osservazione del valore chiave potrebbe funzionare e, in caso affermativo, è decisamente molto più comoda dell'aggiornamento esplicito.

+0

Ehi svena, grazie per la risposta. Dove inserirò il refreshObject: mergeChanges? Sarebbe all'interno di un'azione? Grazie! – mhbdr

+0

È possibile aggiornare l'oggetto nei punti in cui si conosce la data di modifica. Tuttavia, ti incoraggio ad adottare l'approccio raccomandato da Mundi. È molto più conveniente È giusto sapere che puoi sempre aggiornare una proprietà temporanea in modo esplicito, se lo desideri. – svena

+0

Sembra che le proprietà transitori non vengano aggiornate: "Se flag è YES, questo metodo non influisce sulle proprietà dei transitori" https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506224-refreshobject –

7

Prima, assicurarsi che la proprietà temporanea sia utilizzata solo per sectionNameKeyPath durante la creazione del controller dei risultati recuperati. Il nome migliore è sectionIdentifier (come fa Apple nel codice di esempio). La data effettiva dovrebbe essere un attributo separato della tua entità. (Lo chiamerò dateAttribute

In secondo luogo, assicurarsi di specificare le dipendenze percorso della chiave nel file Entity.m:.

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier { 
    // If the value of dateAttribute changes, the section identifier may change as well. 
    return [NSSet setWithObject:@"dateAttribute"]; 
} 

Terzo, assicurarsi che nel controller, è reagire in modo adeguato ai cambiamenti del contesto oggetto gestito attraverso

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (!self.tableView.editing) [self.tableView reloadData]; 
    // the quick and dirty method without animations; 
    // see referenced code for a more pleasant approach 
} 

Se qualcosa non è chiaro, dare un'occhiata l'esempio di Apple DateSectionTitles.

+0

Sei sicuro al 100% che keyPathsForValuesAffecting ... impone un aggiornamento mentre si tratta di una proprietà temporanea? In precedenza ho notato che le proprietà transitori vengono aggiornate solo quando refreshObject: mergeChanges: viene inviato all'oggetto. – svena

+0

Sì, certo. Questo è un codice funzionante da un'app live. – Mundi

+0

Quindi ho impostato quasi esattamente come l'esempio di Apple, ma non sembra aggiornarsi quando c'è un cambiamento. L'identificatore di sezione per ogni elemento è creato da un grande calcolo di differenze nsdate, ma quando lancio l'app non sembra calcolare di nuovo quelle come fa quando uccido l'app da multitasking e la riapilo. – mhbdr