Я делаю игру с комплектом спрайтов и вам нужно сохранить три целых числа: currentLevel, maxLevelReached и highScore. Я также хотел бы реализовать их для iCloud, но для меня это еще один шаг, сначала я хочу выяснить, какие проблемы у меня есть сейчас. В основном, я пытаюсь использовать основные данные для их хранения. В моем приложении я делегат добавил следующее (в основном я создал новый проект и скопированный код данных ядра)Не удалось загрузить предупреждение класса?
// MARK: - Core Data stack
lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1] as! NSURL
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("GameState", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("APPNAME.sqlite")
var error: NSError? = nil
var failureReason = "There was an error creating or loading the application's saved data."
if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil {
coordinator = nil
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
NSLog("Unresolved error \(error), \(error!.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext? = {
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
// MARK: - Core Data Saving support
func saveContext() {
if let moc = self.managedObjectContext {
var error: NSError? = nil
if moc.hasChanges && !moc.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()
}
}
}
, когда я сделал это, я создал свою модель данных (File-> новый-> CoreData-> модель данных) и назвал его GameState. Затем я создал объект под названием CurrentLevel и добавил атрибут типа Int16 и name currentLevel. Я создал объект класса Appname.CurrentLevel. Затем в моей игровой сцене я добавил следующие свойства:
var currentLevel = [NSManagedObject]()
var levelToShow: Int16!
И создал эти две функции для обработки данных основных данных.
//Handling the fetching from the CoreData
func fetchTheStuff() {
//1
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName:"CurrentLevel")
//3
var error: NSError?
let fetchedResults =
managedContext.executeFetchRequest(fetchRequest,
error: &error) as? [NSManagedObject]
if let results = fetchedResults {
currentLevel = results
println(currentLevel)
} else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
//Handling the saving
func saveCurrentLevel(cLevel: Int16){
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let entity = NSEntityDescription.entityForName("CurrentLevel",
inManagedObjectContext:
managedContext)
let curLevel = NSManagedObject(entity: entity!,
insertIntoManagedObjectContext:managedContext)
curLevel.setValue(name, forKey: "currentLevel")
var error: NSError?
if !managedContext.save(&error) {
println("Could not save \(error), \(error?.userInfo)")
}
}
Как вы можете видеть, функция выборки все еще находится на стадии тестирования (я просто печатаю результаты). Если я извлечу его при первом использовании приложения, он даст мне пустую строку, как и должно быть. Однако, если я попытаюсь сохранить число с помощью функции сохранения и затем извлечь материал, на экране журнала появится следующее предупреждение:
CoreData: warning: Не удалось загрузить класс с именем 'appname.CurrentLevel' для объекта 'CurrentLevel' , Класс не найден, вместо этого используется NSManagedObject по умолчанию.
Зная функцию, которую я хочу достичь, увидев способ, которым я пользуюсь (пытается), знает кто-нибудь, как решить мою проблему?
P.S. Кроме того, похоже, что весь этот материал данных ядра довольно сложный, мне трудно понять, как именно он работает, хотя я много читал об этом. Поэтому, если у кого-то есть предложение по уменьшению сложности для достижения того же результата (следовательно, не используя никакой функции), советы более чем приветствуются.
вы правильно генерировать файлы классов для модели coredata? – gutenmorgenuhu
извините, но не могли бы вы объяснить, что вы имеете в виду? Если бы я знал. – TruniTr
в вашей модели coredata. выделите объекты и выберите «Редактор -> Создать подкласс NSObject». Для этого требуется правильно настроенная модель, которая соответствует вашему коду – gutenmorgenuhu