Core Data NSPredicate für Beziehungen funktioniert nicht nach [context save]

9

Ich habe zwei Entitäten in Core Data (siehe unten) und verwende NSFetchedResultsController mit [NSPredicate predicateWithFormat:@"calendar.subscribed == 1"]; , um das "Event" -Objekt zu extrahieren.

Kalender

  • abonniert (BOOL)
  • Ereignisse (Eins-zu-viele-Beziehung zu "Event")

Ereignis

  • Kalender (Viele-zu-eins-Beziehung zu "Kalender")

Alles funktioniert gut, aber wenn ich die Eigenschaft subscribed eines "Kalenders" ändere und den Kontext in einem anderen Thread speicher, wird controllerDidChangeContent nicht aufgerufen.

kann ich zum Nachholen zwingen? und wie?

    
Yuwen Yan 12.06.2015, 16:13
quelle

3 Antworten

0

Leider überwacht der FRC nur die Objekte, die Gegenstand des Abrufs sind (in Ihrem Fall Event ). Daher werden Änderungen an Attributen verwandter Objekte nicht erkannt, obwohl diese Änderungen Auswirkungen auf die Bewertung des Prädikats haben könnten.

Eine Problemumgehung (wenn Sie mit dem Performance-Treffer leben können) ist, wenn Sie den Attributwert Calendar ändern, einen Wert für das zugehörige Event -Objekt auf seinen vorhandenen Wert zu ändern - keine Änderung in der Theorie, aber genug, um den FRC auszulösen, um das Prädikat für dieses Event neu zu bewerten.

    
pbasdf 12.06.2015 17:32
quelle
0

Wie in der anderen Antwort erwähnt, nimmt NSFetchedResultsController nur die Änderungen an den Event-Objekten und nicht am Kalender auf. Um eine Aktualisierung zu erzwingen, können Sie eine NSNotification überall dort posten, wo Sie den abonnierten Status eines Kalenders direkt nach dem Aufruf von 'saveContext' aktualisieren:

%Vor%

Fügen Sie dann einen Beobachter in der Klasse hinzu, die Sie aktualisieren möchten:

%Vor%

Füllen Sie eine 'updateEventData' (oder wie auch immer Sie es nennen möchten) Methode mit Code aus, um den Abruf auszuführen, und Sie sollten gut gehen.

    
BevTheDev 16.06.2015 21:01
quelle
0

Sie können einen Beobachter zu Kalender hinzufügen, der im Event

geschrieben ist %Vor%

Anstelle von "anyProperty" verwenden Sie den Namen des Ereignisses. Ich habe den gleichen Ansatz verwendet, bevor es funktioniert.

    
sim 16.06.2015 21:16
quelle