Я столкнулся с загадочной проблемой:
У меня есть только один метод для вставки объектов в Core Data.Я пытаюсь вставить данные двумя разными способами: один из UITableView с кнопкой +.Другой из обычного UIViewController, вызывая метод ниже.
В конце метода метод возвращает NSManagedObject в обоих случаях, но счетчик fetchedObjects увеличивается только в случае вставки из UITableViewController,
Если я сначала загружаю UITableViewController, все последующие вызовы метода правильно увеличивают количество извлекаемых объектов.Если я этого не сделаю, число останется прежним, даже если NSManagedObjects возвращаются из метода. При последующем перезапуске приложения «невидимые» объекты загружаются снова и становятся видимыми
Мне кажется, что проблема связана с ManagedObjectContext, но я не вижу, где я неправильно его установил,
В проекте используются iOS5, ARC и раскадровки.
-(Event*)insertAndReturnNewEventWithSeverity:(int)type
{
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
Event *newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
newManagedObject.insert_datetime = [NSDate date];
NSError *error = nil;
if (![context save:&error]) {
/*
Replace this implementation with code to handle the error appropriately.
abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// abort();
}
NSLog(@"objects: %i", self.fetchedResultsController.fetchedObjects.count );
return newManagedObject;
}
Существует только один контекст managedObject, который инициализируется в делегате приложения.
-(NSManagedObjectContext*)managedObjectContext
{
if(__managedObjectContext!=nil)
{
return __managedObjectContext;
}else{
self.managedObjectContext = self.appDelegate.managedObjectContext;
}
return __managedObjectContext;
}
ОБНОВЛЕНИЕ: Добавление моего UIViewController
в качестве делегата к NSFetchedResultsController
и добавление didChangeObject и didChangeSection заставляет свойство .fetchedObjects корректно увеличиваться само по себе!
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.coreDataManager.fetchedResultsController.delegate = self;
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
NSLog(@"Changed object");
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
NSLog(@"Changed section");
}
Спасибо за помощь!