Es gibt viele sehr ähnliche Fragen auf StackOverflow, aber ich frage das, weil fast jede vorhandene Frage dadurch verursacht wird, performFetch
auf dem FRC nicht aufzurufen.NSFetchedResultController ruft controllerDidChangeContent nicht im Delegaten auf
In diesem Fall nennen wir es.
fetchedResultsController = NSFetchedResultsController(fetchRequest: StepRecord.fetchRequest(forDate: date),
managedObjectContext: theMainThreadContext,
sectionNameKeyPath: nil,
cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch (let error) {
print(error)
}
Dann in einer späteren Funktion, wir haben so etwas wie dieses ...
func updateScreen() {
if fetchedResultsController.fetchedObjects.count == 0 {
// download data and store into core data
}
// update the screen
}
Und wir haben die Delegatmethode ...
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
updateScreen()
}
Der Ort, in schreibt Core-Daten schreiben definitiv in eine backgroundThreadContext
(das ist ein Muster, das wir mehrmals in der App verwendet haben und es funktioniert woanders).
Die Delegate-Methode wird in diesem Fall jedoch nicht aufgerufen.
Wenn wir den Bildschirm verlassen und gehen in der updateScreen
Methode läuft und der FRC hat Daten. Damit die Abrufanforderung korrekt ist, werden durch den Download Datensätze an der richtigen Stelle abgelegt und ordnungsgemäß gespeichert, und die Aktualisierungsbildschirmmethode kann diese Elemente abrufen und den Bildschirm füllen.
Das einzige Problem, das wir hier haben, ist, dass die Delegate-Methode nicht aufgerufen wird.
Gibt es etwas, was wir hier verpasst haben? Wie ich schon sagte, wir haben das gleiche Muster an einigen Stellen verwendet und es funktioniert. Nur in diesem Fall funktioniert es nicht.
Lassen Sie mich wissen, ob es einen anderen Code gibt, den Sie sehen möchten, und ich werde ihn weitergeben, wenn ich kann.
@ SeanLintern88 AFAIK 'controllerDidChangeContent' enthält auch Zusätze, so dass das Hinzufügen von Daten in der Abrufanforderung die Delegate-Methoden auslösen sollte. – Fogmeister
Sie sagen also, dass die hinzugefügten Daten auch dann ein Update verursachen sollten, wenn die ursprünglichen Daten leer sind? Wenn ja, könnten Sie die Abrufanforderung posten: D 'StepRecord.fetchRequest (forDate: date)' – SeanLintern88
@ SeanLintern88 yep, so funktioniert es. Am Ende funktionierte es. Danke – Fogmeister