2015-06-12 12 views
9

Ho due entità in Dati principali (vedere sotto) e uso NSFetchedResultsController con [NSPredicate predicateWithFormat:@"calendar.subscribed == 1"]; per estrarre l'oggetto "Evento".Dati principali NSPredicate per le relazioni non funziona dopo [salva contesto]

Calendario

  • sottoscritto (BOOL)
  • eventi (uno-a-molti a "Evento")

Evento

  • calendario (molti-a- una relazione con "Calendario")

Tutto funziona correttamente, ma se cambio la proprietà subscribed di alcuni "Calendario" e salvo il contesto in altro thread, controllerDidChangeContent non è stato chiamato.

Posso forzare il recupero? e come?

+0

È possibile rimuovere il predicato per ricevere tutte le modifiche all'evento, quindi controllare manualmente il contrassegno di sottoscrizione nel metodo delegato. –

+0

Oppure è possibile recuperare dall'entità Calendario dove è impostato il flag sottoscritto, quindi recuperare tutti gli eventi associati nel metodo delegato –

risposta

0

Purtroppo il FRC controlla solo gli oggetti oggetto del recupero (nel tuo caso Event). Pertanto, non riconosce le modifiche agli attributi degli oggetti correlati, anche se tali modifiche potrebbero influire sul modo in cui il predicato valuta.

Una soluzione (se si può vivere con il calo di prestazioni) è, quando si cambia valore di attributo dell'oggetto Calendar, per modificare un valore sul associato Event oggetto al suo valore attuale - nessun cambiamento in teoria, ma sufficiente per far scattare il FRC rivalutare il predicato per quello Event.

+0

grazie, ma vorrei mantenere la mia domanda aperta e vedere se possiamo avere una soluzione migliore. –

+0

Certo: vorrei una soluzione più pulita da solo. – pbasdf

0

Come accennato nell'altra risposta, NSFetchedResultsController rileverà solo le modifiche agli oggetti Evento e non al Calendario. Per forzare un aggiornamento, è possibile inviare un NSNotification ovunque si aggiorna lo stato sottoscritto di un calendario subito dopo si chiama 'saveContext':

[[NSNotificationCenter defaultCenter] postNotificationName:@"calendarSubscriptionUpdated" object:nil]; 

Quindi aggiungere un osservatore nella classe che si desidera aggiornare:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateEventData:) name:@"calendarSubscriptionUpdated" object:nil]; 

Compilare un metodo 'updateEventData' (o qualsiasi altra cosa si voglia chiamare) con il codice per eseguire il recupero, e si dovrebbe essere a posto.

0

È possibile aggiungere osservatore Calendar.subscribed in caso

-(void)awakeFromFetch { 
    [ self addObserver:self 
      forKeyPath:@"calendar.subscribed" 
       options:NSKeyValueObservingOptionNew 
       context:NULL ]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    if ([keyPath isEqualToString:@"calendar.subscribed"]) { 
     [ self willChangeValueForKey:@"anyProperty" ]; 
     [ self didChangeValueForKey:@"anyProperty" ]; 
    } 
} 

-(void)willTurnIntoFault { 
    [ super willTurnIntoFault]; 
    [ self removeObserver:self forKeyPath:@"calendar.subscribed" ]; 
} 

Invece di "anyProperty" utilizzare il nome reale della struttura della Manifestazione. Ho usato lo stesso approccio prima che funzioni.