Intereting Posts
Как найти SKStoreProductParameterCampaignToken и SKStoreProductParameterAffiliateToken конкретного приложения iTunes? UIWebView, показывающий, что Google Maps отключает управление масштабированием Английские локализованные файлы не загружаются Откройте в моем приложении для (xlsx, ppt, pptx.docx) из сафари или почты, не работающей iPhone – Синхронизация двух iPhone, чтобы заставить их запускать задачу в одно и то же время Ошибка при экспорте контактов с использованием структуры адресной книги iOS 9? Автосайт iOS с неизвестными высотами iOS: изменение размера TableView в зависимости от размера экрана Как обойти углы фона моего индикатора активности UIView convertRect: – поиск позиции подзаголовка двумя видами в глубину Использование Swift 3 в XCode 8, как управлять подвью UITableView SKPhysicsContactDelegate не работает UIKit <-segue-> утечка памяти SpriteKit Swift 3.0 – Рисование на изображенииView с пальцем Управление локальными уведомлениями для инфраструктуры iOS с маяками

Основные данные сохраняют только около 50% времени

Я только начал использовать Core Data с sql-lite, поэтому я немного новичок. Я основывал свой код на разных учебниках онлайн и создавал приложение для хранения основных данных xcode для справки. Для чего это стоит, я интегрирую это в существующее приложение cocos2d.

Все шло хорошо, пока я не заметил, что экономия не всегда работает. Контекстное сохранение всегда возвращает true, но иногда я возвращаю старые данные, когда я его извлекаю. Ошибок не возникает. Я отлаживал, чтобы убедиться, что передаю ему нужные данные для сохранения, но я не могу понять, что я делаю неправильно.

Вот часть моего «SaveDataManager», который обрабатывает сохранение и извлечение данных. Это объект экземпляра моего делегата приложения.

Функция сохранения.

- (bool) saveSongOptionData { NSManagedObjectContext *context = ((AppDelegate*)[[UIApplication sharedApplication] delegate]).managedObjectContext; NSManagedObject *newData = [NSEntityDescription insertNewObjectForEntityForName:@"SongOptions" inManagedObjectContext:context]; NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"SongOptions" inManagedObjectContext:context]; //First check if row exists, if not create it. If so, update that row with our new high score information. NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDesc]; //Only should be 1 record, grab it [request setFetchLimit:1]; NSManagedObject *matches = nil; NSError *error; NSArray *objects = [context executeFetchRequest:request error:&error]; if ([objects count] == 0) //None!! Lets create one { [newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].background] forKey:@"background"]; [newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].random] forKey:@"random"]; [newData setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].vibrate] forKey:@"vibrate"]; } else { matches = [objects objectAtIndex:0]; [matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].background] forKey:@"background"]; [matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].random] forKey:@"random"]; [matches setValue:[NSNumber numberWithBool:[GlobalVariables sharedInstance].vibrate] forKey:@"vibrate"]; } [request release]; bool success = [context save:&error]; if (!success) NSLog(@"%@", error.localizedDescription); return success; } 

В моем AppDelegate я создаю экземпляр «SaveDataManager» и передаю ему такой контекст в методе applicationDidFinishLaunching:

 self.dataManager = [[SavedDataManager alloc] init]; self.dataManager.managedObjectContext = self.managedObjectContext; 

А для получения контекста и т. Д.

 #pragma mark - Core Data stack - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) return _managedObjectContext; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) return _managedObjectModel; NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TestGame" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) return _persistentStoreCoordinator; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestGame.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } 

Я не уверен, достаточно ли информации, но я был бы очень благодарен, если бы кто-нибудь мог направить меня в правильном направлении, почему это может произойти.

Вам нужно сохранить контекст в applicationWillTerminate: и, вероятно, в applicationDidEnterBackground: также. Я использую этот бит кода для сохранения в обоих этих методах:

 NSError *error; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Update to handle the error appropriately. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); exit(-1); // Fail } } 

Я получил это прямо из примера Apple Core Data.

Решил. Простая ошибка. Я действительно удивился, что он работает вообще. Если вы заметили в коде, который я разместил, я использовал переменные «_». Это было потому, что я синтезировал переменные, т. Е. «ManagedObjectContext = _managedObjectContext». Это заменило мои пользовательские геттеры. Не уверен, что это поможет кому-то, но просто убедитесь, что вы читали о синтезе, так как я избегал этого в течение длительного времени: P