我有一个核心数据模型用于保存我的spritekit游戏的排行榜 但是,出于某种原因,当我第一次运行游戏时,它传递到排行榜的表视图控制器时发生错误。
在添加断点并尝试调试之后,我发现由于某种原因,核心数据模型中已经存在一组数据,其中nil
值表示错误。
我在打印出用于保存数据的NSManagedObject
后发现了这一点,
下图显示了我的意思:
我的问题是我在任何时候都没有添加这些值。
但是,每次应用程序运行时它们都会出现。
我已经多次查看我的代码,似乎无法找到它为什么不断添加。
这并不是强制解开值这么简单,因为这样做所有这一切都不会在运行代码时出错。
但是,在填充表视图时,它仍然显示一组等于nil的数据,这是我不能拥有的。
我的代码如下:
应用代表
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "ScoreModel")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
func saveContext () {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
排行榜桌面视图控制器Swift文件
import CoreData
class LeaderboardTableVC: UITableViewController {
var finishedGame = 0
var gameScore:Int! = 0
var name:String!
var date:String!
var score:Int!
var scoreData = [NSManagedObject]()
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.isNavigationBarHidden = false
self.navigationItem.hidesBackButton = true
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Scores")
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
do {
let results = try managedContext.fetch(fetchRequest)
scoreData = results as! [NSManagedObject]
print(scoreData)
for result in results as! [NSManagedObject] {
name = result.value(forKey: "name") as? String
date = result.value(forKey: "date") as? String
score = result.value(forKey: "score") as? Int
}
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
self.tableView.reloadData()
}
知道为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:0)
在CoreData中,定义在实体中的所有属性在创建时都包含在实体的每个实例中。如果属性被定义为可选,则可以创建实体的实例而不指定属性的值,并且属性的值将为nil - 就像在类定义中名称和日期变量的值从nil开始一样包括在内。从这个意义上讲,您通过创建NSManagedObject实例的行为添加了nil值。
由于这几乎是不可避免的,因此您需要1)在添加实体实例时向字段添加值(并且您可以通过使这些非可选来强制您的手),或2)添加警卫或测试以避免在属性字段为零时尝试解包。