Używam NSFetchedResultsController do zapełniania i zarządzania źródłem danych tabel.Czy muszę ręcznie zapisać obiekt managedObjectContext for NSFetchedResultsController, jeśli zmienię atrybut?
Kiedy użytkownik wybiera pewien wiersz, actionsheet wyskakuje a następnie pozwala użytkownikowi zmieniać wartość dla tego wiersza:
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:selectedRowIndexPath];
[managedObject setValue:status forKey:@"status"];
To działa bardzo dobrze i mogę natychmiast zobaczyć zmiany w tableview. Oznacza to, że NSFetchedResultsController wie, że coś się zmieniło i dlatego ponownie wczytuje ten tableviewcell. Gdy zatrzymam i zamknę aplikację (całkowicie), a następnie ponownie ją otworzę, zmiana nie zostanie zapisana.
Myślę, że NSFetchedResultsConroller dba o zapisywanie zmian.
Czy po każdej zmianie muszę ręcznie zapisywać, używając następującego kodu?
// Save the context.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
A może wywołać ten kod w:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
Więc nie jest to zły pomysł, aby zapisać wewnątrz metody delegata "didChangeObject"? – Pieter
Jeśli to zrobisz, możesz zaryzykować pętlę. NSFetchedResultsController delegate metody są używane do aktualizacji widoku, a nie modelu. Tak więc zawsze, gdy coś jest zapisywane w kontekście, widok jest odpowiednio aktualizowany (w zasadzie, więc nie trzeba ciągle przeładowywać widoku tabeli). Jeśli zapisałeś do kontekstu w metodzie delegatów, metoda delegata kontynuowałaby ostrzał, ponieważ zauważyłaby zmianę kontekstu. – Gobot
Jakie jest rozwiązanie? – fatuhoku