Frage

Ich schreibe eine app mit zwei Tabellen auf einem Bildschirm. Die linke Tabelle ist eine Liste der Ordner und der rechten Tabelle zeigt eine Liste von Dateien. Wenn auf einer Reihe auf der linken Seite geklopft, wird die richtige Tabelle sind die Dateien angezeigt werden in diesem Ordner gehören.

Ich bin mit Core Data für die Lagerung. Wenn die Auswahl der Ordner ändert, holen das Prädikat der NSFetchedResultsController der rechten Tabelle wird eine neue holen ändern und ausführen, laden Sie dann die Tabellendaten. Früher habe ich den folgenden Codeausschnitt:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {   
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[table reloadData];

Doch die holen Ergebnisse sind immer noch die gleichen . Ich habe NSLog'ed „Prädikat“ vor und nach dem holen, und sie mit aktuellen Informationen korrekt waren. Die Abruf- Ergebnisse bleiben die gleichen wie anfängliche fetch (wenn Ansicht geladen wird).

Ich bin nicht sehr vertraut mit der Art und Weise Core Data Objekte abruft (gibt es ein Caching-System?), Aber ich habe vor ähnliche Dinge getan (Prädikate ändern, Wieder Abrufen von Daten und erfrischende Tabelle) mit einzelnen Tabellenansichten und alles ging gut.

Wenn jemand gab könnte mir einen Hinweis, den ich sehr geschätzt würde.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich hatte fast genau dieses Problem, bis ich den Hinweis in einem sehr aktuellen Blog-Beitrag unter iphone Inkubator

NSFetchedResultsController wird das Caching die ersten Ergebnisse. (Sie wahrscheinlich etwas Satz an initWithFetchRequest haben: managedObjectContext: sectionNameKeyPath: cachename)

Ich bin Ihr Code erraten (wie bei mir) ist eine Ableitung der Coredata Probe, so ist es unter der Annahme, @ „Root“, bevor Sie das Prädikat ändern, führen Sie eine

[NSFetchedResultsController deleteCacheWithName:@"Root"];  

Andere Tipps

In meinem Fall deafgreatdane Antwort der nicht funktioniert; was ich tat, ist stattdessen wahrscheinlich naiv, aber funktioniert:

  • erstellen entsprechende Prädikat (s) in der configureCell:atIndexPath: Methode (in tableView:cellForRowAtIndexPath: genannt)
  • rufen:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • beziehen sich auf das zurückgegebene Objekt durch [self.fetchedResultsController objectAtIndexPath:indexPath] Aufruf

Das ist für mich gearbeitet:

[NSFetchedResultsController deleteCacheWithName:nil];  
[self.fetchedResultsController.fetchRequest setPredicate:predicate]; 

NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
    NSLog(@"%@, %@", error, [error userInfo]);
    abort();
} 

ein ähnliches Problem in meinem schnellen Projekt hat. Das ist für mich gearbeitet

NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top