2015-05-08 3 views
0

Я делаю игру с комплектом спрайтов и вам нужно сохранить три целых числа: 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. Кроме того, похоже, что весь этот материал данных ядра довольно сложный, мне трудно понять, как именно он работает, хотя я много читал об этом. Поэтому, если у кого-то есть предложение по уменьшению сложности для достижения того же результата (следовательно, не используя никакой функции), советы более чем приветствуются.

+0

вы правильно генерировать файлы классов для модели coredata? – gutenmorgenuhu

+0

извините, но не могли бы вы объяснить, что вы имеете в виду? Если бы я знал. – TruniTr

+0

в вашей модели coredata. выделите объекты и выберите «Редактор -> Создать подкласс NSObject». Для этого требуется правильно настроенная модель, которая соответствует вашему коду – gutenmorgenuhu

ответ

0

Ответ на первоначальный вопрос Пожалуйста, убедитесь,, чтобы генерировать правильные классы для вашей CoreData модели, выделяя свои объекты, а затем они выбрали Editor -> Создать NSObject подкласс

Смежные вопросы